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
будет рассматривать его как директорию, только если этот путь существует и уже является директорией или ссылкой на директорию) Вы можете добавить косую черту в конец пути назначения, чтобы убедиться, что он всегда рассматривается как директория, а не как файл.
Есть несколько инструментов, позволяющих делать то, что вы хотите. Мне больше всего нравится 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
.
попробуйте заменить
ssh -t $line 'script /dev/null . /tmp/commands.sh'
на
ssh $line 'bash /tmp/commands.sh'