Запуск ssh-агента з сценарію оболонки


19

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

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

Проблема в цьому полягає в тому, що ssh-агент починає черговий екземпляр $ SHELL (в моєму випадку bash), і з точки зору сценарію він виконує все, а ssh-add і все, що нижче нього, ніколи не запускається.

Як я можу запустити ssh-агент зі свого скрипта оболонки і продовжувати його рухатись вниз по списку команд?

Відповіді:


8

ssh-agent повинен розпочати сеанс, і коли він закінчить, сеанс користувача закінчиться. Отже, будь-яка команда після ssh-агента, можливо, буде виконуватися після виходу з системи.

Що ви хочете, це session-scriptте, що містить такі ваші сеанси команди:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

Тоді почніть ssh-agent session-script.


Спасибі! Створення окремого сценарію та закінчення сценарію виконано exit.
День

2
що таке сеанс-скрипт?
Олександр Міллс

15

Поставте наступне у верхній частині сценарію:

eval `ssh-agent`

Ваш сценарій повинен виглядати так:

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

Пояснення

Повернення навколо ssh-agentзбирає свій результат. evalзбирає цей вихід, об'єднує його в одну команду, а потім виконує команду. Потім ви можете використовувати ssh-addсвої ключові дані.


9
Це саме те, що мені було потрібно, дякую, хоча варто зазначити, що задній план виходить назовні. У новій баш-формі це має бутиeval $(ssh-agent)
sibaz

Це рішення не спрацювало для мене, поки я не поставив bash -iв кінці сценарію.
Адольфо Кореа

6

Я схильний робити щось подібне в сценаріях, для яких потрібен агент.

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

По суті, перше, що він перевіряє, перевіряє, чи працює агент. Якщо це не exec, замість сценарію використовується новий процес. Агент запускається, додаються ключі і, нарешті, сценарій знову викликається (див. $0).


Але це не збереже жодних параметрів сценарію. І якщо будь-який з параметрів має пробіл, пропустити їх буде непросто.
Denilson Sá Maia

3
Ви можете використовувати .. "ssh-add ; $0 $*", або .. "ssh-add ; $0 $@"замість цього, що може працювати. Що не було б ідеально, але, безумовно, спрацювало б у багатьох випадках. Найкраще рішення - майже завжди, щоб ваш агент працював перед будь-яким іншим, це просто щось, що може бути корисним у незрозумілих випадках.
Зоредаче

6

Я знайшов, що це працює для мене.

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

Я створюю ssh-агент процес, додаю ключ, роблю те, що мені потрібно зробити, а потім вбиваю його. Не потрібно перевіряти, чи працює він пізніше.


4

У цьому випадку краще використовувати брелок

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

Додайте у свій .bashrc наступне:

eval `keychain --eval id_rsa`

Краще? Чому краще?
JFlo

@JFlo "Краще" в цьому, він збереже змінні env до $ HOME / .keychain / <file>. Якщо запустити цю команду ще раз, виберіть наявний ssh-агент, якщо він все ще працює. Потім його можна повторно використовувати між оболонками / сценаріями. У деяких сценаріях, які не є надзвичайно безпечними, тому вам потрібно здійснити цей дзвінок. Для мене це поліпшення в порівнянні з деякими сценаріями, які я написав, щоб виконати те саме завдання
Скотт Карлсон

2

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

Я виявив, що наступний шебанг ставиться у верхній частині сценарію:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"

-2

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

ssh-keygen -p

Це дуже небезпечна практика. Навіщо взагалі турбуватися використовувати ssh? Якщо ви не захистите свій приватний ключ, ви можете також говорити чітким текстом.
JFlo

@JFlo: ні, якщо ваша клієнтська система є достатньо захищеною, що це може бути. Особливо, якщо ви (можете і робити) додавати ACL, SELinux або подібні, що легко зі статичним файлом, але менше, ніж з рандомізованим сокетом ssh-агента. Це сказав, що я зазвичай не рекомендую це як перший вибір.
dave_thompson_085

Хоча це дуже корисний процес, який ви надаєте, я не думаю, що він нічого не відповідає на питання ОП.
Олександр Птах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.