Як використовувати 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

Це також, здається, затримується нескінченно. Чи є краще рішення цієї проблеми ?? Я не бачу способу використання судо-су з того, що я можу сказати ...

Дякуємо за будь-яку допомогу!


Чому закритий голос? Це питання на тему: управління апаратним чи програмним забезпеченням серверів, робочих станцій, сховищ даних або мереж, інструментів, що використовуються для адміністрування, моніторингу та автоматизації цих програм
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

У мене є свій обліковий запис у судерах на віддаленій стороні, щоб не потрібно було вводити пароль.

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


На жаль, оскільки я не керую віддаленим сервером, я вважаю, що я тут застряг, використовуючи sudo su. Це все-таки буде працювати в такому форматі?
Matt124234

так, це теж буде працювати. ви можете ввести пароль при появі запиту.
Майкл Мартінес

Я спробував: ssh -t mrhyner@stg-app3.indeed.net << EOF sudo su - adcentrl egrep 'ПОМИЛКА \ | ПОПЕРЕДЖЕННЯ / home / adcentrl / cronjobs / logs / * / * EOF Але я отримав: "Псевдо -термінал не буде виділено, оскільки stdin не є терміналом. "
Matt124234

зовсім гаразд. ігноруйте це попередження і продовжуйте. якщо ви хочете, ви можете вимкнути "RequireTty" в / etc / sudoers на віддаленому кінці
Michael Martinez

5

Якщо ви не хочете або не можете зупинити судо від того, щоб задати вам пароль, один простий трюк - прочитати його локально та зберегти в локальній змінній:

read -p 'Password: ' -s password

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

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

Дуже цікаво. Однак використання ssh без -t підказує мені, що "немає присутніх". Додавання в -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

Мені це стало причиною того, що Баш чомусь не вшановує команду ssh. Діє так, що я намагаюсь отримати судо від свого місцевого господаря = \
Matt124234
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.