gpt4 book ai didi

bash - 执行后Bash脚本不会退出SSH主机

转载 作者:行者123 更新时间:2023-12-02 14:27:46 25 4
gpt4 key购买 nike

我正在运行要将静态IP设置为的CentOS 7 VM。

运行SSHPASS=password sshpass -e ssh -tt -o "StrictHostKeyChecking no" host@192.168.122.229 'echo "password" | sudo -Sv && bash -s' < script.sh会执行script.sh中的所有命令,但是完成后,无论我在bash脚本的末尾是否有exit命令,终端都将留在VM中。

传递密码的原因是跳过在终端中输入密码。

这是我的bash脚本:

sudo cp /etc/sysconfig/network-scripts/ifcfg-ens3  /etc/sysconfig/network-scripts/ifcfg-ens3:0
sudo sed -i 's/BOOTPROTO="dhcp"/BOOTPROTO="static"/g' /etc/sysconfig/network-scripts/ifcfg-ens3:0
sudo sed -i 's/NAME="ens3"/NAME="ens3:0"/g' /etc/sysconfig/network-scripts/ifcfg-ens3:0
sudo sed -i 's/DEVICE="ens3"/DEVICE="ens3:0"/g' /etc/sysconfig/network-scripts/ifcfg-ens3:0
echo 'PEERDNS="yes"' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-ens3:0
echo 'IPADDR=192.168.122.201' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-ens3:0
echo 'NETMASK=255.255.255.0' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-ens3:0
echo 'GATEWAY=192.168.122.1' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-ens3:0
sudo systemctl restart network
exit

理想情况下,我想在同一脚本中执行这些命令,但似乎无法弄清楚问题出在哪里。

有趣的注意:如果运行 cat script.sh | SSHPASS=password sshpass -e ssh -tt host@192.168.122.229 'echo "password" | sudo -Sv && bash -s',控制台将停止在 exit命令上(未输入),如果按Enter进行输入,则虚拟机将停止运行,只能使用CTRL + C退出。

更新
如果我运行的 ./script.sh具有以下内容...
ssh -tt host@192.168.122.229 'echo "password" | sudo -Sv && bash -s' << EOF
echo
sudo cp /etc/sysconfig/network-scripts/ifcfg-ens3 /etc/sysconfig/network-scripts/ifcfg-ens3:0
sudo sed -i 's/BOOTPROTO="dhcp"/BOOTPROTO="static"/g' /etc/sysconfig/network-scripts/ifcfg-ens3:0
sudo sed -i 's/NAME="ens3"/NAME="ens3:0"/g' /etc/sysconfig/network-scripts/ifcfg-ens3:0
sudo sed -i 's/DEVICE="ens3"/DEVICE="ens3:0"/g' /etc/sysconfig/network-scripts/ifcfg-ens3:0
echo 'PEERDNS="yes"' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-ens3:0
echo 'IPADDR=192.168.122.201' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-ens3:0
echo 'NETMASK=255.255.255.0' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-ens3:0
echo 'GATEWAY=192.168.122.1' | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-ens3:0
exit
EOF

一切正常。这使我相信该问题与 sudo systemctl restart network有关。通过在脚本末尾添加 sudo systemctl restart network; exit进行确认。可能与该命令的性质有关。

最佳答案

您的目标是在VM中编辑文件。除了echo "password"在VM上,您的任何命令都不会运行任何命令。

什么(应该)工作

以下内容未经测试。您想要的是让sudo远程运行,从脚本中读取ssh通过标准输入通过连接传递。就像是

SSHPASS=password sshpass -e ssh host@192.168.122.229 \
'{ echo "password"; cat; }| sudo -Sv bash' < script.sh
cat确保 ssh从标准输入中读取密码后,会通过 sudo读取通过连接发送的所有内容。

什么问题

您的第一个命令
SSHPASS=password sshpass -e ssh \
-tt \
-o "StrictHostKeyChecking no" \
host@192.168.122.229 'echo "password" |
sudo -Sv &&
bash -s' < script.sh

通过运行 sshpass开始。它登录到远程主机,运行 echo "password",然后注销。该输出将通过管道传递给 sudo -Sv,该命令无需运行任何命令,只会忽略其输入并成功退出。然后 bash在本地运行从脚本读取的代码。

您的第二条命令
cat script.sh | 
SSHPASS=password sshpass -e ssh -tt host@192.168.122.229 'echo "password" |
sudo -Sv &&
bash -s'

将脚本的内容通过管道传输到 sshpass,该脚本再次登录到远程主机并执行命令,忽略脚本,然后退出。然后 sudo忽略其输入并成功退出,启动 bash -s阻止,等待输入。

顺便说一句,您的脚本可以简化为
cd /etc/sysconfig/network-scripts
{
sed -e 's/BOOTPROTO="dhcp"/BOOTPROTO="static"/g' \
-e 's/NAME="ens3"/NAME="ens3:0"/g' \
-e 's/DEVICE="ens3"/DEVICE="ens3:0"/g' ifcfg-ens3
echo 'PEERDNS="yes"'
echo 'IPADDR=192.168.122.201'
echo 'NETMASK=255.255.255.0'
echo 'GATEWAY=192.168.122.1'
} > ifcfg-ens3:0
systemctl restart network

没有 sudo(因为脚本是使用 sudo执行的),一个 sed命令(从原始文件读取)和多个 echo都写入同一输出文件。

关于bash - 执行后Bash脚本不会退出SSH主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60394992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com