Tente executá-lo desta maneira:
TestHost1="host01 host02 host03"
for host in $TestHost1
do sshpass -p password ssh -T -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no username@$host "sudo sed -i 's/10./172./g'/etc/hosts"
done
Eu tento migrar o código shell para o código de estrutura Python. O problema que encontro é que o Python não pode executar o comando com raiz em um host Linux remoto. Alguém poderia encontrar esse problema e descobrir? Eu sou muito grato pela sua ajuda. Agradecemos antecipadamente.
TestHost1="host01 host02 host03"
for host in $TestHost1
do sshpass -p password ssh -T -q -o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no username@$host << EOL;
sudo su -
sed -i 's/10./172./g'/etc/hosts
EOL
done
Tente executá-lo desta maneira:
TestHost1="host01 host02 host03"
for host in $TestHost1
do sshpass -p password ssh -T -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no username@$host "sudo sed -i 's/10./172./g'/etc/hosts"
done
Para que sudo
possa solicitar uma senha, você precisa dar a ela um dispositivo tty (a pseudo-tty ). ssh
geralmente cria o dispositivo pseudo-tty no terminal remoto se sua entrada também for de um terminal. No entanto, neste caso não é - você está usando um heredoc (o <<
bit).
Para copiar seu estilo, você precisa adicionar a opção RequestTTY
a ssh
, também disponível como -t
. Confusamente, você tem explicitamente desativado pseudo-tty alocação com o seu -T
bandeira, então você precisa substituir isso:
TestHost1="host01 host02 host03"
for host in $TestHost1
do sshpass -p password ssh -t -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no username@$host << EOL;
sudo su -
sed -i 's/10./172./g' /etc/hosts
EOL
done
No entanto, convém rever sua correspondência de substituição 10.
; como está, que corresponde aos dois caracteres 10
mais qualquer caractere (o .
é um curinga), várias vezes por linha. Talvez deva ser 10\.
(corresponde a três caracteres literais) ou mesmo ^10\.
(corresponde a três caracteres literais no início da linha). Aqui eu assumi que você quis dizer três caracteres literais 10.
no início da linha:
TestHost1="host01 host02 host03"
for host in $TestHost1
do sshpass -p password ssh -t -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no username@$host sudo sed -i.bak 's/^10\./172./' /etc/hosts
done