Команда SSH не запускается изнутри скрипта bash, но запускается из оболочки - PullRequest
2 голосов
/ 23 апреля 2019

Команда ssh не запускается изнутри скрипта bash, но запускается из оболочки.

Я создал простой скрипт, и он показывает, что команда ssh завершается неудачно до того, как достигает удаленной машины.

Вывод оболочки показывает следующее:

  • Удаленный компьютер работает
  • Сценарий находится на локальном хосте, а команда ssh находится в функции с именем doit
  • Выполнение сценария возвращает ошибку в строке 5 (строка с командой ssh): «Нет такого файла или каталога»
  • Скопируйте и вставьте команду ssh в оболочку, нажмите Enter, она выполняется и достигает удаленного компьютера, что возвращает и выдает ошибку, поскольку ключ не настроен (ожидается)

Вывод из оболочки:

~ $ nping -c 1 104.248.173.32

Starting Nping 0.7.01 ( https://nmap.org/nping ) at 2019-04-23 22:04 ICT
libnsock mksock_bind_addr(): Bind to 0.0.0.0:0 failed (IOD #1): Invalid argument (22)
SENT (0.0016s) Starting TCP Handshake > 104.248.173.32:80
RECV (0.0017s) Handshake with 104.248.173.32:80 completed

Max rtt: 0.177ms | Min rtt: 0.177ms | Avg rtt: 0.177ms
TCP connection attempts: 1 | Successful connections: 1 | Failed: 0 (0.00%)
Nping done: 1 IP address pinged in 0.00 seconds
~ $ cat /tmp/test.sh
#!/usr/bin/env bash

function doit() {
  RUN="/usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=3 root@104.248.173.32 hostname"
  "$RUN"
  echo "RESULT: $?"
}

doit  
~ $ /tmp/test.sh
/tmp/test.sh: line 5: /usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=3 root@104.248.173.32 hostname: No such file or directory
RESULT: 127
~ $ /usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=3 root@104.248.173.32 hostname
Host key verification failed.
~ $ echo $?
255

Я ожидал, что команда ssh в сценарии попытается запустить имя хоста на удаленном компьютере, и на удаленном компьютере произойдет ошибка, поскольку ключ не настроен.

На самом деле произошло то, что команда ssh в сценарии не выполнялась, поскольку произошла ошибка «Нет такого файла или каталога».

Почему я вижу ошибку «Нет такого файла или каталога», когда команда ssh запускается из скрипта, даже если скрипт есть, есть ssh и есть удаленный компьютер?

1 Ответ

2 голосов
/ 23 апреля 2019
/usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=3 root@ipaddress hostname

и

"/usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=3 root@ipaddress hostname"

... не совпадают.Первый выполняет команду /usr/bin/ssh с указанными аргументами.Последний обрабатывает всю строку, включая аргументы, как имя команды.

Вы сделали первое при выполнении команды в оболочке.Однако функция doit выполняет последнее с "$RUN".Вы получаете сообщение «Нет такого файла или каталога», потому что в самом деле нет файла с именем ssh -o BatchMode... (усеченного для краткости) внутри /usr/bin.

Либо выполните команду напрямую, если это возможно, либо удалите командуцитаты:

function doit1() {
  /usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=3 root@ipaddress hostname
  echo "RESULT: $?"
}

function doit2() {
  # assuming there is some usefulness to using a variable in the actual script
  RUN="/usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=3 root@ipaddress hostname"
  $RUN
  echo "RESULT: $?"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...