Как использовать ssh и sudo вместе в bash?

10

Я не смог найти вопрос, который описывает этот конкретный сценарий.

Я пытаюсь выполнить очень простой bash-скрипт для получения журналов с нескольких машин. Я запускаю скрипт локально, но мне нужен доступ к внешней машине через ssh, а также sudo для привилегированного пользователя на этой машине ...

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

Запуск этого с sh -x показывает, что bash застревает в строке 'ssh'. Поэтому я попытался пересмотреть это к этому:

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

Это также, кажется, останавливается на неопределенный срок. Есть ли лучшее решение этой проблемы? Я не вижу способа использовать sudo su из того, что я могу сказать ...

Спасибо за любую помощь!

Matt124234
источник
Почему закрытое голосование? Этот вопрос по теме: управление аппаратным или программным обеспечением серверов, рабочих станций, хранилищ или сетей, инструментов, используемых для администрирования, мониторинга или их автоматизации
jlliagre

Ответы:

5

Чтобы добиться этого в моей текущей среде, нужно запустить ssh с -tфлагом, который вызывает распределение tty, а затем запустить внутри него sudo -u root следующим образом:

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

У меня есть учетная запись в sudoers на удаленной стороне, поэтому пароль не требуется.

В этом примере показаны различные способы сделать это в одном сеансе ssh, включая запуск нескольких команд с помощью bash или в подоболочке. Также обратите внимание, что если вы поместите приведенный выше код в исполняемый скрипт, вы можете передать аргументы командной строки ($ 1 и $ 2) в ssh, и они будут расширены, а затем будут ссылаться на удаленную сторону.

Майкл Мартинес
источник
К сожалению, из-за того, что я не управляю удаленным сервером, я считаю, что я застрял здесь с помощью sudo su. Будет ли это работать в этом формате?
Matt124234 29.12.14
да, это тоже будет работать. Вы можете ввести пароль при появлении запроса.
Майкл Мартинес
Я пробовал: ssh -t mrhyner@stg-app3.indeed.net << EOF sudo su - adcentrl egrep 'ОШИБКА \ | WARN' / home / adcentrl / cronjobs / logs / * / * EOF Но я получил: "Псевдо -терминал не будет выделен, потому что stdin не является терминалом. "
Matt124234
отлично хорошо проигнорируйте это предупреждение и продолжайте. если вы хотите, вы можете отключить «RequireTty» в / etc / sudoers на удаленном конце
Майкл Мартинес,
5

Если вы не хотите или не можете остановить sudo от запроса пароля, один простой прием - прочитать его локально и сохранить в локальной переменной:

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF
xpmatteo
источник
1

Если sudo сконфигурировано так, чтобы разрешать команды без пароля, это должно делать то, что вы хотите:

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

или

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

в зависимости от того, хотите ли вы file.txtсоздать файл локально или удаленно.

В противном случае, вот способ передать пароль удаленного пользователя sudo:

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"
jlliagre
источник
Очень интересно. Однако использование ssh без -t говорит мне "нет tty present". Добавление в -t удаляет эту ошибку, но, похоже, не учитывает sudo su, так как запрашивает пароль. Вот что конкретно я делаю: ssh -t mrhyner@test-server.net "sudo su - adcentrl -c egrep" ОШИБКА \ | ПРЕДУПРЕЖДЕНИЕ "/ home / adcentrl / cronjobs / logs / * / *" Это дает мне: bash : ПРЕДУПРЕЖДЕНИЕ: команда не найдена [sudo] пароль для mrhyner:
Matt124234
Извините, я, видимо, не знаю, как отформатировать мои комментарии в этой вещи
Matt124234
Я предполагал, что sudo был настроен для удаленного доступа к учетной записи без пароля.
Jlliagre
и вам не хватает дополнительных одинарных кавычек.
Jlliagre
Это и привело меня к мысли, что bash по какой-то причине не соблюдает команду ssh. Он действует так, будто я пытаюсь получить sudo от моего локального хоста = \
Matt124234