Як передати пароль на su / sudo / ssh, не змінюючи TTY?


148

Я пишу програму C Shell, яка буде робити suчи sudoабо ssh. Всі вони хочуть, щоб їх паролі були введені в консоль (TTY), а не в stdin або в командному рядку.

Хтось знає рішення?

Налаштування без пароля - sudoце не варіант.

може бути варіантом, але він не присутній у моїй програмі, що знімається.



Відповіді:


215

Для sudo існує -S можливість прийому пароля зі стандартного вводу. Ось запис людини:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

Це дозволить вам запустити таку команду, як:

echo myPassword | sudo -S ls /tmp

Що стосується ssh, то я багато разів намагався автоматизувати / сценаріювати його використання без успіху. Здається, немає ніякого вбудованого способу передавати пароль в команду без запиту. Як зазначали інші, утиліта " очікувати ", схоже, спрямована на вирішення цієї дилеми, але в кінцевому підсумку, встановлення правильної авторизації приватного ключа - це правильний шлях при спробі автоматизації цього.


2
На щастя, у Ruby є вбудований клієнт SSH, який дозволяє вказати пароль. Ви можете спробувати ruby ​​-e "вимагати 'net / ssh'; Net :: SSH.start ('example.com', 'test_user',: пароль => 'секрет') do | ssh | ставить 'Ввійшов у систему успішно'; поки cmd = get; ставить ssh.exec! (cmd); end end "
користувач1158559

13
Я ненавиджу бути учасником партії, але це може зробити ваш пароль відображеним у списку процесів. Я намагався визначити кращий спосіб, і натрапив на цю статтю, і я був здивований, що ніхто її не вказав. Прекрасне рішення, але остерігайтеся ризиків.
Метт

Про ssh, ви намагалися пропустити пароль у рядку з'єднання? як nonroot:yourpassword@hostname.com? Звичайно, все набагато простіше, якщо ви використовуєте ключ авторизації та керування ключами.
Кілла

12
Уникайте відображення пароля у списку процесів чи файлах журналу, додаючи його у файл та використовуючи cat; 'cat pw | sudo -S <command>, і пізніше rm pw.
CAB

Іншим способом було б використовувати netcat та доставити пароль через сокет - nc -l 12345 | sudo -S <command>. На стороні відправки; echo myPassord | nc <target> 12345. Це просто переміщує проблему з паролем, але, мабуть, на головну консоль, де у вас є більше варіантів.
CAB

36

Я написав деякий Applescript, який вимагає ввести пароль через діалогове вікно, а потім будує власну команду bash, як це:

echo <password> | sudo -S <command>

Я не впевнений, чи допоможе це.

Було б добре, якби sudo прийняв попередньо зашифрований пароль, тому я міг зашифрувати його в рамках свого сценарію і не турбуватися про повторення ясних текстових паролів навколо. Однак це працює для мене та моєї ситуації.


27

Для sshви можете використовувати sshpass: sshpass -p yourpassphrase ssh user@host.

Вам просто потрібно спочатку завантажити sshpass :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

12

У мене є:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

Працює для мене.


Не працювало для мене. ще ssh підкаже пароль.
AKS

Чудово, нарешті щось я можу використати! Дякую. Я використовую це в скрипті bash, який запускає ssh сесію і передає клієнтові sudo команди. У моєму сценарії є рядки: ssh -t username @ hostname bash -c "sudo echo fartjuice"
James T Snell


10

Звичайним рішенням цієї проблеми є налаштування додатка-помічника, який виконує завдання, що вимагає доступу суперпользователя: http://en.wikipedia.org/wiki/Setuid

Судо не призначений для використання в автономному режимі.

Пізніше редагуйте: SSH може використовуватися для автентифікації приватного публічного ключа. Якщо в приватному ключі немає парольної фрази, ssh можна використовувати без запрошення пароля.


10

Це можна зробити, встановивши відкриті / приватні ключі на цільових хостах, до яких ви будете підключатися. Першим кроком було б генерувати ключ ssh для користувача, який запускає скрипт на локальному хості, виконавши:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

Потім введіть порожній пароль. Після цього скопіюйте ключ ssh на цільовий хост, до якого ви будете підключатися.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

Після реєстрації ключів ssh ви зможете виконати безшумний ssh remote_user@other_hostвід вас місцевий хост.


7

Можливо, ви можете використовувати expectкоманду ?:

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

Ця команда автоматично вводить пароль.


Виглядає добре, але як я можу включити команду очікування на машині без дозволів root?
Radon8472

1
@ Radon8472 Виконавець може бути доданий до ~ / bin, якщо у вас немає дозволів на його встановлення. Якщо ваша система автоматично не додає ~ / bin до вашої PATH, ви можете зробити це вручну за допомогою експорту PATH = "$ PATH: ~ / bin" або додати цю команду до свого профілю, щоб зробити це автоматично. Якщо ви не хочете змінювати свій PATH, ви можете замість цього виконати команду, використовуючи її абсолютний шлях: ~ / bin / очаква [аргументи] Не забудьте пам’ятати, щоб встановити його виконуваний біт: chmod + x ~ / bin / очікувати
StarCrashr

6

Коли немає кращого вибору (як пропонують інші), людина socat може допомогти:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

Всі складні, складні, складні складності необхідні, і, хоча вам може не спати так довго, вам доведеться спати. Параметр echo = 0 також варто переглянути, як це передає віддалену команду в командному рядку ssh.


1
Насправді це також спрацює su. suне має опції -S (stdin).
аус

Чи можна уникнути сну і використовувати замість цього щось більш надійне?
Михайло Паньков

6

Погляньте на expectутиліту Linux.

Це дозволяє надіслати вихід у stdio на основі простого узгодження шаблону на stdin.


1

Налаштуйте SSH для аутентифікації відкритих ключів, не маючи парольних фраз на ключі. Вантажі путівників в мережі. Тоді вам не знадобиться пароль для входу. Потім ви можете обмежити з'єднання для ключа на основі імені клієнта. Забезпечує розумну безпеку і чудово підходить для автоматизованих входів.


1
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

Якщо ви можете увійти як користувач за допомогою ключа ssh, для доступу до sudo це нормально: ssh -t user @ host "echo mypassword | sudo -S sudocommand"
Джек

0

У мене була така ж проблема. діалоговий скрипт для створення каталогу на віддаленому ПК. діалог із ssh простий. Я використовую sshpass (раніше встановлений).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

привітання з Німеччини

тит


0

Спираючись на відповідь @ Jahid, це працювало для мене на macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

0

краща sshpassальтернатива: passh https://github.com/clarkwang/passh

Вхід на віддалений сервер

 $ passh -p password ssh user@host

Запустіть команду на віддаленому сервері

 $ passh -p password ssh user@host date

інші методи передачі пароля

-p Пароль (за замовчуванням: `пароль ')

-p env: прочитати пароль від env var

-p файл: зчитування пароля з файлу

тут я пояснив, чому це краще, ніж sshpass та інші рішення.


-1
echo <password> | su -c <command> <user> 

Це працює.


1
Це єдина для мене робота у Fedora. Люди відповідають на відповіді лише тому, що вони не працюють у своїй ситуації?
Hangchen Yu

2
"su: потрібно запустити з терміналу" (RPi1B, Raspbian)
notme1560,

На жаль, цього немає в останніх версіях програми su, яка читає пароль замість stdio .
moutonjr

-1

Жорстке кодування пароля в очікуваному скрипті - це те саме, що мати sudo без пароля, насправді гірше, оскільки sudo принаймні реєструє свої команди.


-1

Одним із способів було б використання параметра read -s .. таким чином символи пароля не відлунюються назад на екран. Я написав невеликий сценарій для деяких випадків використання, і ви можете побачити його в моєму блозі: http://www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/


-1

ВИКОРИСТАННЯ:

echo password | sudo command

Приклад:

echo password | sudo apt-get update; whoami

Сподіваюся, що це допомагає ..


-2

Ви можете вказати пароль як параметр для очікування сценарію.


-11
su -c "Command" < "Password"

Сподіваюся, це корисно.


1
Це не. "su: треба запускати з терміналу" - це відповідь.
thelogix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.