无法在远程 Linux 主机中使用 root 执行命令

无法在远程 Linux 主机中使用 root 执行命令

我尝试将 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

相关内容