Bash скрипт не выходит из S SH хоста после выполнения - PullRequest
0 голосов
/ 25 февраля 2020

Я использую виртуальную машину CentOS 7, для которой я хочу установить IP-адрес c.

Запуск SSHPASS=password sshpass -e ssh -tt -o "StrictHostKeyChecking no" host@192.168.122.229 'echo "password" | sudo -Sv && bash -s' < script.sh выполняет все команды в script.sh, но после завершения терминал остается внутри виртуальная машина, независимо от того, есть ли у меня команда 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', консоль останавливается на команде exit (не вводится), и если я нажимаю клавишу ввода для ее ввода, виртуальная машина останавливается, и я могу выйти только с помощью 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 в конце скрипта. Может быть, это как-то связано с характером этой команды.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Ваша цель - отредактировать файл в вашей виртуальной машине. Ни одна из ваших команд не выполняет ничего, кроме echo "password" на виртуальной машине.

Что (должно) работать

Следующее не проверено. Вы хотите , чтобы 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 все записи в один и тот же выходной файл.

1 голос
/ 25 февраля 2020

Пожалуйста, попробуйте что-то вроде этого

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

...