SSH к нескольким хостам в файле и команда запуска не удалась -идет только к первому хосту

Во-первых, в вашей команде очевидная ошибка. Ваша программа работает только в локальной сети, но вы перенаправляете соединение на общедоступный IP-адрес, используя -L 200:8.8.8.8:200. Поэтому вместо этого вы должны использовать -L 200:10.0.0.8:200.

Во-вторых, при использовании -L 200:10.0.0.8:299клиент ssh по умолчанию будет прослушивать только localhost:200. Это поведение можно настроить с помощью параметра GatewayPorts. Чтобы явно указать ssh-клиенту принимать соединения с других хостов, вы можете использовать -L 0.0.0.0:10.0.0.8:200. Изman ssh_config:

     GatewayPorts
             Specifies whether remote hosts are allowed to connect to local forwarded ports.  By default, ssh(1) binds local port forwardings to the loopback address.  This
             prevents other remote hosts from connecting to forwarded ports.  GatewayPorts can be used to specify that ssh should bind local port forwardings to the wild‐
             card address, thus allowing remote hosts to connect to forwarded ports.  The argument must be yes or no (the default).

8
20.01.2021, 17:13
2 ответа

ssh pre -считывает стандартный ввод в предположении, что удаленному заданию потребуются некоторые данные, и это ускоряет запуск -. Таким образом, первое задание съедает остальную часть вашего списка хостов.

Вы можете предотвратить это, используя параметр ssh -nили перенаправляя наподобие ssh < /dev/null. Будучи человеком с ремнями -и -подтяжками, я делаю и то, и другое:ssh -n < /dev/null <other ssh options>.

Если вы действительно хотите, чтобы удаленное задание что-то читало из локальной системы, вам нужно передать это или здесь -документировать это для каждой итерации. Даже с for <host>ssh будет считывать неопределенное количество данных со стандартного ввода при каждом запуске хоста -.

Я всегда пинговал удаленный хост, чтобы получить статус до того, как подключился к нему по ssh. IIRC, ping -Wимеет параметр жесткого тайм-аута, а sshможет зависать в DNS или при подключении более 90 секунд для неизвестного или мертвого хоста.

17
18.03.2021, 22:35

Вы также можете использовать для этого pdsh, это позволяет запускать команду параллельно на нескольких хостах.

pdsh -w ^hostlist.txt -R ssh "cat /etc/redhat-release"

^определяет файл со списком имен хостов, в качестве альтернативы можно использовать список, разделенный запятыми:

pdsh -w host1,host2,host3,... -R ssh "cat /etc/redhat-release"

Результат будет выглядеть так::

pdsh, -w raspi,raspi.local,192.168.0.3,localhost,127.0.0.1 -R ssh "cat /etc/issue"

raspi: Raspbian GNU/Linux 10 \n \l
raspi: 
raspi.local: Raspbian GNU/Linux 10 \n \l
raspi.local: 
192.168.0.3: Raspbian GNU/Linux 10 \n \l
192.168.0.3: 
localhost: Debian GNU/Linux 10 \n \l
localhost: 
127.0.0.1: Debian GNU/Linux 10 \n \l
127.0.0.1: 
6
18.03.2021, 22:35

Теги

Похожие вопросы