Несколько команд с котировками после SSHing

У меня есть сервер, на котором я должен использовать ssh со многими командами, которые используют использование переменной и, следовательно, много кавычек. Если мы рассмотрим сценарий:

ssh user@host "kinit -k -t /path/to/dir/`whoami`.`hostname -s`.keytab `whoami`/`hostname -f`@host ; set -x touch health_check.log ; echo \"Starting HDFS health check\" > health_check.log ; echo \"/path/to\" >> health_check.log ; hdfs dfs -du -h /path/to &>> health_check.log ; echo \"************************************************************************** /path/to/dir\" >> health_check.log ; hdfs dfs -du -h /path/to/dir &>> health_check.log ; subject=\"HDFS Health Check\" ; from=\"noreply@example.com\" ; recipients=\"user@email.com\" ; mail=\"subject:$subject\nfrom:$from\nContent-Type: text/html\nMIME-Version: 1.0\n\n$(cat health_check.log)\" ; echo -e $mail | sendmail \"$recipients\" ; set +x rm health_check.log " 

Когда я запускаю скрипт, я получаю этот вывод отладки:

  • Неплохо ли порт пересылать порт 443 для ssh?
  • Выделите три последних обновленных файла в выводе ls
  • Регулярное выражение в Bash для проверки IP-адреса
  • Скрипт не ждет подпроцессов из цикла
  • Извлечение URL из неформатированного текста
  • Вопросы о функциях whiptail и bash
  •  ++ subject='HDFS Health Check' ++ from=noreply@example.com ++ recipients=user@email.com ++ mail='subject:\nfrom:\nContent-Type: text/html\nMIME-Version: 1.0\n\nStarting HDFS health check /data/gftocon' ++ echo -e ++ sendmail '' 

    Обратите внимание на пустые строки, где должны быть мои переменные. Почему избежать кавычек не удалось?

  • Ограничить список команд по SSH
  • Преобразование разрешений в вывод `ls -l` в восьмеричный
  • Добавление в массивы
  • Можно ли выйти из SSH в LocalCommand?
  • Gentoo Linux GPG правильно шифрует файл, прошедший через параметр, но при чтении со стандартного ввода выбрасывает «Несоответствующий ioctl для устройства»
  • Как запустить автозаполнение без клавиши табуляции?
  • 2 Solutions collect form web for “Несколько команд с котировками после SSHing”

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

     ssh user@host <<'END_COMMANDS' # ...............^............^ these quotes make the whole document single-quoted kinit -k -t /path/to/dir/`whoami`.`hostname -s`.keytab `whoami`/`hostname -f`@host set -x echo "Starting HDFS health check" > health_check.log echo "/path/to" >> health_check.log hdfs dfs -du -h /path/to &>> health_check.log echo "************************************************************************** /path/to/dir" >> health_check.log hdfs dfs -du -h /path/to/dir &>> health_check.log subject="HDFS Health Check" from="noreply@example.com" recipients="user@email.com" headers="subject:$subject from:$from Content-Type: text/html MIME-Version: 1.0" { echo "$headers"; echo; cat health_check.log; } | sendmail "$recipients" set +x rm health_check.log END_COMMANDS при ssh user@host <<'END_COMMANDS' # ...............^............^ these quotes make the whole document single-quoted kinit -k -t /path/to/dir/`whoami`.`hostname -s`.keytab `whoami`/`hostname -f`@host set -x echo "Starting HDFS health check" > health_check.log echo "/path/to" >> health_check.log hdfs dfs -du -h /path/to &>> health_check.log echo "************************************************************************** /path/to/dir" >> health_check.log hdfs dfs -du -h /path/to/dir &>> health_check.log subject="HDFS Health Check" from="noreply@example.com" recipients="user@email.com" headers="subject:$subject from:$from Content-Type: text/html MIME-Version: 1.0" { echo "$headers"; echo; cat health_check.log; } | sendmail "$recipients" set +x rm health_check.log END_COMMANDS 

    Я думаю, что это проще в обслуживании.

    Я думаю, вам следует избегать $ символов из вашего блока.

    Ваша почтовая команда станет:

     mail=\"subject:\$subject\nfrom:\$from\nContent-Type: text/html\nMIME-Version: 1.0\n\n\$(cat health_check.log)\" 

    Примечание: похоже, что работает $(cat) . Не знаю, почему.

    Linux и Unix - лучшая ОС в мире.