Некоторый вывод, потерянный в команде, передан в SSH

Я пытаюсь использовать команду SSH для SSH к серверу и запуститьuseradd Команда, которую я передал ему. Похоже, что он работает нормально по большей части (без ошибок), но хешированный пароль в /etc/shadow в файле не хватает соли (я думаю, что это та часть, которой не хватает.).

Я не уверен, что цитирование неверно или нет. Но выполнение этой команды вручную на сервере работает нормально, поэтому я предполагаю, что это расширение, которое испортилось.

Команда ниже выполняется внутри скрипта Bash...

Команда:

ssh user@$host "useradd -d /usr/local/nagios -p $(perl -e 'print crypt("mypassword", "\$6\$salt");') -g nagios nagios && chown -R nagios:nagios /usr/local/nagios"

* Когда я избегаю двойных кавычек внутри однострочного perl, я получаю сообщение об ошибке:

Не удается найти терминатор строки "" "нигде до EOF в строке -e 1.

Использование: useradd [опции] ВХОД

Есть идеи, что я здесь делаю не так?

2 ответа

Вместо того, чтобы заключать всю команду в двойные кавычки и проверять правильность экранирования всего в ней, будет более надежно использовать одинарные кавычки и обрабатывать встроенные одинарные кавычки по мере необходимости. На самом деле нет встроенных одинарных кавычек для обработки, только встроенный литерал $ в $6$salt,

ssh "user@$host" 'useradd -d /usr/local/nagios -p $(perl -e "print crypt(q{mypassword}, q{\$6\$salt});") -g nagios nagios && chown -R nagios:nagios /usr/local/nagios'
echo "useradd -d /usr/local/nagios -p $(perl -e 'print crypt("mypassword", "\$6\$salt");') -g nagios nagios && chown -R nagios:nagios /usr/local/nagios" > /tmp/tempcommand && scp /tmp/tempcommand root@server1:/tmp && ssh server1 "sh -x /tmp/tempcommand && finger nagios && rm /tmp/tempcommand"

В таких случаях я всегда предпочитаю иметь локальный файл на локальном / удаленном сервере, с которого я выполняю набор команд. Сохраняет много "времени отладки цитат". То, что я делаю выше, - это сначала сохранить длинную однострочную версию в файл локально, "как есть" и "как работает" локально, скопировать его с помощью scp на удаленный сервер и выполнить там с оболочкой. Более безопасный способ (не нужно копировать файл). Опять же - сохраните его локально и передайте его удаленному bash с параметром - s:

echo "useradd -d /usr/local/nagios -p $(perl -e 'print crypt("mypassword", "\$6\$salt");') -g nagios nagios && chown -R nagios:nagios /usr/local/nagios" > /tmp/tempcommand && echo finger nagios >> /tmp/tempcommand && ssh server1 'bash -s' < /tmp/tempcommand
Другие вопросы по тегам