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