Рассмотрим следующую команду:
ssh aristotle sudo /bin/sh < test.sh
Я хочу, чтобы перенаправление применялось к, /bin/sh
но оно потребляется sudo. Есть идеи, как добиться того, чего я хочу?
решение1
Почему бы просто не скопировать test.sh и затем не вызвать его?
scp test.sh aristotle:/tmp/test.$$.sh
ssh aristotle sudo /bin/sh /tmp/test.$$.sh
ssh aristotle rm /tmp/test.$$.sh
$$ — это PID процесса на локальной машине, что обеспечивает некоторую степень случайности, чтобы ваш файл не был затерт.
решение2
Перенаправлениеявляетсяработает с ssh и sudo! Это только мешает любому диалогу пароля от ssh и/или sudo.
Поэтому ЛИБО вы не используете перенаправление, а обходные пути, например, сначала копируете скрипт на целевую машину, а затем выполняете его (как, например, @edoloughlinпредложенный).
ИЛИ вы настраиваете ssh и sudo так, чтобы они не запрашивали пароль. Тогда все работает как часы:
$ echo "hostname" | ssh -A orwell sudo /bin/sh
orwell
Есть тысячи руководств, объясняющих, как использовать ssh без пароля, поэтому я не буду объяснять эту часть. А что касается sudo, есть несколько способов использовать его без пароля. @jtimbermanпредложенныйразрешить данному пользователю использовать sudo без пароля в целом (через NOPASSWD
функцию sudo, см.sudoers(5)).
Я лично использую модуль PAM.pam-ssh-агент. Он позволяет sudo аутентифицироваться с помощью перенаправленного агента ssh и возвращается к аутентификации на основе пароля только в случае отсутствия агента ssh. В Debian и Ubuntu просто
apt-get install pam-ssh-agent-auth
а затем настройте, как описано вpam_ssh_agent_auth(8).
решение3
Попробуйте так:
ssh aristotle sudo /bin/sh -c "/bin/sh \\< test.sh"
решение4
Я пользовался ssh somehost sudo cat \< /etc/passwd
с некоторым успехом; попробуйте что-нибудь вроде:
ssh aristotle sudo /bin/sh \< test.sh