Не способный к ssh в к удаленной машине с помощью сценария оболочки в Crontab

Для не подрыва значения ответов, данных другими людьми но я верю тому, что Вы хотите, это:

(cd /path/to && ./executable [ARGS])

Отметьте parens для вызова cd в подоболочке.

11
23.03.2011, 01:20
5 ответов

Можно сделать соединения SSH в рамках сессии крона. То, в чем Вы нуждаетесь, должно установить аутентификацию с открытым ключом, чтобы иметь доступ без пароля. Чтобы это работало, Вы должны иметь PubkeyAuthentication yes в каждом удаленном сервере sshd_config.

Можно создать частную/с открытым ключом пару с или без пароля. Если Вы используете пароль (повторно прокомментировал), что необходимо также запустить ssh-агент. Без пароля только необходимо добавить параметр -i your_identity_file кому: ssh командная строка. ssh будет использовать $HOME/.ssh/id_rsa как значение по умолчанию.

Я копировал Ваш пример при помощи пары ключей с паролем. Вот то, как я сделал это.

1) Созданный пара ключей с паролем. Сохраненный закрытый ключ как ~/.ssh/id_rsa_test, который должен иметь корректные полномочия по умолчанию. Мы можем ввести пустой пароль для того, чтобы не использовать тот.

john@coffee:~$ ssh-keygen -N "somephrase" -f .ssh/id_rsa_test
Generating public/private rsa key pair.
Your identification has been saved in .ssh/id_rsa_test.
Your public key has been saved in .ssh/id_rsa_test.pub.
[snip]

2) Отправленный открытый ключ на серверы, сделал то же для всех них. Помните, что они должны иметь PubkeyAuthentication включенный.

john@coffee:~$ ssh-copy-id -i .ssh/id_rsa_test server1
The authenticity of host 'server1 (11.22.33.1)' can't be established.
RSA key fingerprint is 79:e8:0d:f5:a3:33:1c:ae:f5:24:55:86:82:31:b2:76.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server1,11.22.33.1' (RSA) to the list of known hosts.
john@server1's password: 
Now try logging into the machine, with "ssh 'server1'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

3) Выполненный ssh-агент как сервис с -s. Это не уничтожит его, если Вы выйдете из системы. Ее вывод является действительным сценарием оболочки, устанавливая среду, таким образом, ssh клиент будет знать, как соединиться с нею. Мы сохраняем это в файл (только первая строка действительно необходима).

john@coffee:~$ ssh-agent -s | head -n 1 > ssh-agent.cf 
john@coffee:~$ cat ssh-agent.cf 
SSH_AUTH_SOCK=/tmp/ssh-VhyKL22691/agent.22691; export SSH_AUTH_SOCK;

4) Загруженное вышеупомянутое к нашей текущей среде, таким образом, мы можем использовать ssh-add добавить наш закрытый ключ к ssh-agent. пароль сверху.

john@coffee:~$ source ssh-agent.cf 
john@coffee:~$ ssh-add  .ssh/id_rsa_test
Enter passphrase for .ssh/id_rsa_test: 
Identity added: .ssh/id_rsa_test (.ssh/id_rsa_test)

5) Проверенный это добавляется.

john@coffee:~$ ssh-add -l
2048 96:58:94:67:da:67:c0:5f:b9:0c:40:9b:52:62:55:6a .ssh/id_rsa_test (RSA)

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

john@coffee:~$ cat foo.sh 
#!/bin/bash

source /home/john/ssh-agent.cf
for server in server1 server2; do
    usr=$(ssh -t -t -o ConnectTimeout=60 $server finger | tail -1 | awk '{print $1}')
    date=$(ssh -o ConnectTimeout=60 $server date)
    echo "$server - $date - $usr" >> /home/john/foo.log
done

7) Мой crontab (отмечают что мой sh на самом деле bash)

john@coffee:~$ crontab -l
# m h  dom mon dow   command
*/1  *  *  *  *  sh /home/john/foo.sh

8) Вывод

john@coffee:~$ tail -n 4 foo.log
server1 - Wed Mar 23 14:12:03 EET 2011 - john
server2 - Wed Mar 23 14:12:04 EET 2011 - john
server1 - Wed Mar 23 14:13:03 EET 2011 - john
server2 - Wed Mar 23 14:13:04 EET 2011 - john

Единственная проблема с использованием пароля состоит в том, что необходимо ввести его вручную по крайней мере в один раз. Так, вышеупомянутое не будет автоматически работать после перезагрузки.

13
27.01.2020, 19:57
  • 1
    Замечательный - спасибо. Я не могу жить ни с каким автоматическим перезапуском после перезагрузки на данный момент, по крайней мере. –  Peter Mounce 05.12.2012, 14:04
  • 2
    Используйте ssh-крон для установки запланированных соединений SSH к защищенным серверам, не выставляя ключи SSH, но с помощью агента SSH. unix.stackexchange.com/questions/8903 / … –  Luchostein 03.08.2016, 20:12

Кто вводит пароль? Задание крона не может достигнуть Ваш ssh-агент, таким образом открытый ключ не будет работать.

Необходимо предоставить ssh с файлом ключей явно (см. -i опция), так как это не может запросить агент; и тот ключ должен иметь пустой пароль.

4
27.01.2020, 19:57
  • 1
    Попробованный путем передачи имени пользователя и пароля также - палец ssh-t-t-o ConnectTimeout=60 за 1 user@machine$ | хвост-1 | awk '{1 print$}' </home/user/passwd----я подразумеваю, что корневой каталог находится на NFS, таким образом, это монтируется к everymachine –   09.03.2011, 09:53
  • 2
    , Если ssh имеет какой-либо смысл, это использует /dev/tty считать пароль вместо stdin; это не будет работать от крона. –  geekosaur 09.03.2011, 09:57
  • 3
    Испытанное предоставление-i опция, но никакая удача! палец----ssh-o ConnectTimeout=60-i/home/subrahmanyam/.ssh/known_hosts за 1 machine$ | хвост-1 | awk '{1 print$}'------ПРЕДУПРЕЖДЕНИЕ: НЕЗАЩИЩЕННЫЙ ФАЙЛ СЕКРЕТНЫХ КЛЮЧЕЙ! Полномочия 0640 для '/home/user/.ssh/known_hosts' 'слишком открыты. Рекомендуется, чтобы Ваши файлы секретных ключей НЕ были доступны другими. Этот закрытый ключ будет проигнорирован. плохие полномочия: проигнорируйте ключ: –   09.03.2011, 10:09
  • 4
    Почему это жалуется на known_hosts? Но да, необходимо не упустить полномочия — файл секретных ключей должен быть режимом 0600 или даже 0400, принадлежавший Вам. При необходимости в некотором другом пользователе, чтобы смочь использовать его также, Вы будете иметь, изучают POSIX ACLs или подобный. –  geekosaur 09.03.2011, 10:12
  • 5
    Задумайтесь о нем, я видел, что GSSAPI был предложен там, таким образом, другая возможность состоит в том, чтобы получить keytab и использовать его для kinit в задании крона. Тем не менее keytabs также требуют того же ухода в полномочиях; но ssh по крайней мере, не будет жаловаться на них. –  geekosaur 09.03.2011, 10:16

Вместо того, чтобы хранить временный файл, как в forcefsck, я предпочитаю использовать find для поиска в активном агенте.

Что касается сценария, которому требуется ssh-agent , я использую:

export SSH_AUTH_SOCK=$(find /run/user/$(id -u)/ -mindepth 2 -maxdepth 2 -path '*keyring-*' -name 'ssh' -print -quit 2>/dev/null)

Он ищет сокет ssh-agent и возвращает первый. Он ограничен только текущим пользователем, поэтому вы не сможете случайно попытаться использовать других пользователей и получить ошибку отказа в разрешении. Вам также необходимо уже войти в систему с помощью активного ssh-agent . (Ubuntu запускает агент при запуске графического интерфейса).

Если вы поместите это в другой сценарий, вам нужно будет вызвать его с помощью источника или . , поскольку необходимо установить переменную SSH_AUTH_SOCK .

1
27.01.2020, 19:57

Используйте ssh-cron для настройки запланированных SSH-подключений к защищенным серверам без раскрытия ваших ключей SSH, но с использованием агента SSH.

0
27.01.2020, 19:57

Вы можете запустить свой скрипт или команду в crontab, например:

0 * * * * bash -c -l "/home/user/sshscript.sh"

или

0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"
0
27.01.2020, 19:57

Теги

Похожие вопросы