我尝试将 shell 代码迁移到 Python 结构代码。我遇到的问题是Python无法在远程Linux主机中使用root执行命令。有人能遇到这个问题并解决它吗?我非常感谢你的帮助。提前致谢。
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
答案1
尝试以这种方式执行它:
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
答案2
为了能够sudo
提示输入密码,您需要给它一个 tty 设备(伪tty)。ssh
如果其输入也来自终端,通常会在远程端创建伪 tty 设备。然而,在这种情况下它不是 - 你正在使用特雷多克(<<
一点)。
要复制您的样式,您需要将RequestTTY
选项添加到ssh
,也可以实现为-t
。令人困惑的是你明确地残疾人伪 tty 分配与您的-T
标志,所以您需要替换它:
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
但是,您可能需要查看您的替换匹配10.
;按照目前的情况,每行多次匹配两个字符10
加上任何一个字符(这是一个通配符)。.
也许应该是10\.
(匹配三个文字字符)甚至^10\.
(匹配行开头的三个文字字符)。在这里,我假设您指的是10.
行开头的三个文字字符:
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