Назад | Перейти на главную страницу

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

Мне не удалось найти вопрос, описывающий этот конкретный сценарий.

Я пытаюсь выполнить очень простой сценарий 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 ...

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

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

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF

Способ, которым я достигаю этого в моей текущей среде, - запустить 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 настроен на разрешение команд без пароля, это должно делать то, что вы хотите:

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/*/*'"