Не удается выполнить несколько команд на нескольких машинах Linux?

If DES_PATH="/ngdata/nc_donotdelete/test_out_files/$FILE_NAME. $todayDateVar" не работает, а DES_PATH="/ngdata/nc_donotdelete/test_out_files" работает, то есть /ngdata/nc_donotdelete/test_out_files не существует, и ваш файл сохраняется как /ngdata/nc_donotdelete/test_out_files, а не как /ngdata/nc_donotdelete/test_out_files/$1 (потому что целевой путь может быть либо каталогом, либо именем файла, и scp будет рассматривать его как директорию, только если этот путь существует и уже является директорией или ссылкой на директорию) Вы можете добавить косую черту в конец пути назначения, чтобы убедиться, что он всегда рассматривается как директория, а не как файл.

1
02.09.2015, 09:37
2 ответа

Есть несколько инструментов, позволяющих делать то, что вы хотите. Мне больше всего нравится pdsh , который включает pdcp (multi-host scp), pdsh (multi-host ssh) и dshbak (отображать вывод для нескольких хостов, сгруппированный по хостам) - dshbak полезен, потому что pdsh выполняет команды параллельно на нескольких хостах, а не один за другим. Я много раз использовал pdsh на кластерах, виртуальных машинах, облачных серверах, а также на малых и больших группах физических машин. Он хорошо справляется со своей задачей и прост в настройке.

pdsh доступен предварительно упакованным для большинства дистрибутивов.

Чтобы использовать его, вы должны создать файл hosts (по умолчанию / etc / genders), содержащий имена хостов и разделенный запятыми список имен «групп», к которым они принадлежат. Каждый хост может принадлежать к одной или нескольким группам - например, некоторые хосты могут быть в группе «webserver», некоторые - в группе «dbserver», а все хосты - в группе «all». Например:

somemachineA all
somemachineB all

Затем вы должны использовать pdcp для копирования вашего скрипта на все хосты в группе «все»:

pdcp -g all commands.sh /tmp/

(Примечание: / tmp на удаленных хостах должен быть смонтирован с помощью exec privs - по умолчанию для большинства файловых систем, но это нет ничего необычного в том, что / tmp монтируется noexec в целях безопасности. в этом случае либо pdcp скрипт в другое место, либо его вызов, например, bash /tmp/commands.sh, а не просто / tmp / commands.sh ?)

Затем выполните сценарий на всех хостах:

pdsh -g all /tmp/commands.sh >& /tmp/commands.log

(Примечание: это предполагает, что ssh был настроен на всех хостах для входа без пароля, то есть с использованием ключа ssh, а не пароль.если это не так, вероятно, лучше не перенаправлять вывод в файл журнала, потому что это затруднит интерактивное использование. Вам действительно следует настроить удаленные хосты для доступа к ключу ssh, а затем отключить вход по паролю)

по завершении вы можете просмотреть журнал с помощью dshbak:

dshbak /tmp/commands.log | less

Наконец, одна полезная вещь, которую нужно знать о pdsh и т. Д., Заключается в том, что по умолчанию , он попытается использовать rsh, а не ssh. Понятия не имею, почему, потому что никто в здравом уме больше не использует rsh ... это легко исправить, однако, просто создайте файл с именем / etc / pdsh / rcmd_default и добавьте одну строку, содержащую только ssh .

0
28.01.2020, 01:35

попробуйте заменить

ssh -t $line 'script /dev/null . /tmp/commands.sh'

на

ssh  $line 'bash /tmp/commands.sh'
  • вы пишете сценарий для / dev / null ??
  • если вы выполняете команду в интерактивном режиме, tty будет выделено.
0
28.01.2020, 01:35

Теги

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