Проблема оценки обратных кавычек в команде в кавычках, в su -c, в heredoc, переданных в 2 уровня ssh

Из комментария к отчету об ошибке Red Hat , связанному с ответом Томаша:

It looks like you need to run 00-systemd.conf if you want systemd to recognize that httpd has started successfully.

Я запустил это, и это сработало:

ln -sr /etc/httpd/conf.modules.d/00-systemd.conf /etc/httpd/conf.d/00-systemd.conf
systemctl restart httpd

Я использую Amazon Linux 2 (, вероятно, также будет работать на RHEL/Centos 7 ).

0
03.03.2020, 18:04
1 ответ

Как предложил @pLumo, вы можете избавиться от ада цитирования, используя-J(параметр "JumpHost" )ssh:

ssh -J root@host1 root@host2 "su user2 -c 'kill \"\$(cat ~/file_with_pid)\"'"

Или с здесь -документом:

ssh -J root@host1 -T root@host2 <<'EOT'
su user2 -c 'kill "$(cat ~/file_with_pid)"'
EOT

Обратите внимание на <<'EOT'вместо <<EOT; цитирование маркера конца предотвращает расширение переменных, обратных кавычек и т. д. в документе здесь -.

-Tзапрещает ssh выделять псевдо -tty в целом, и в этом случае он не позволяет ssh предупреждать вас о том, что он не выделен. Если по какой-то причине вам действительно нужен псевдо-tty, используйте две опции -t, чтобы заставить ssh выделить один, даже если локальный stdin не является tty. А также поместите exitздесь -doc:

ssh -J root@host1 -tt root@host2 <<'EOT'
su user2 -c 'kill "$(cat ~/file_with_pid)"'
exit
EOT

Если вам нужно подключиться к другому порту вместо 22 на хосте перехода -, вы должны использовать форму -J user@host1:port;вариант -pбудет применяться кhost2:

ssh -J root@host1:port1 -p port2 root@host2 "su user2 -c 'kill \"\$(cat ~/file_with_pid)\"'"

Я не знаю ни одной опции быстрого доступа, которая позволила бы вам использовать другую идентификацию для хоста перехода -(, как в случае с-i); кажется, что вы должны использовать файл конфигурации для этого.


В вашем примере EOF\nsuбез кавычек — это просто EOFnsu, а не EOF<newline>su(, и это не сработает, даже если бы это было ).

Но перенаправление стандартного вводаssh(как <<здесь -doc делает )предотвратило бы любую интерактивную аутентификацию на втором хосте, так что даже это не исправило бы ваш пример.

1
28.04.2021, 23:21

Теги

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