簡體   English   中英

Bash 腳本在執行后不退出 SSH 主機

[英]Bash script doesn't exit SSH host after execution

我正在運行要為其設置靜態 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 SSHPASS=password sshpass -e ssh -tt -o "StrictHostKeyChecking no" host@192.168.122.229 'echo "password" | sudo -Sv && bash -s' < script.sh執行中的所有命令script.sh但,建成后,VM中的終端停留,我是否有irregardless exit在我的bash腳本或者沒有結束命令。

管道我的密碼的原因是跳過在終端中輸入它。

這是我的 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' cat script.sh | SSHPASS=password sshpass -e ssh -tt host@192.168.122.229 'echo "password" | sudo -Sv && bash -s' cat script.sh | SSHPASS=password sshpass -e ssh -tt host@192.168.122.229 'echo "password" | sudo -Sv && bash -s'控制台在exit命令(未輸入)上停止,如果我按 Enter 輸入它,VM 會停止,我只能用 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確認sudo systemctl restart network; exit 在腳本結束時sudo systemctl restart network; exit 可能跟這個命令的性質有關。

您的目標是在 VM 中編輯文件。 除了在 VM 上echo "password"之外,您的任何命令都沒有運行任何命令。

什么(應該)起作用

以下未測試。 想要的是讓sudo遠程運行,從ssh通過標准輸入通過連接的腳本中讀取。 就像是

SSHPASS=password sshpass -e ssh host@192.168.122.229 \
  '{ echo "password"; cat; }| sudo -Sv bash' < script.sh

cat確保sudo從標准輸入讀取密碼,通過連接發送ssh發送的所有內容。


哪里錯了

你的第一個命令

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都寫入同一個輸出文件。

請嘗試這樣的事情

ssh -t ubuntu@xyz.com << EOF
 command1
 command2
 exit
EOF

或者

SSHPASS=password sshpass -e ssh -tt -o "StrictHostKeyChecking no" host@192.168.122.229 'echo "password" | sudo -Sv && bash -s' < script.sh && exit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM