Для не подрыва значения ответов, данных другими людьми но я верю тому, что Вы хотите, это:
(cd /path/to && ./executable [ARGS])
Отметьте parens для вызова cd
в подоболочке.
Можно сделать соединения 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
Единственная проблема с использованием пароля состоит в том, что необходимо ввести его вручную по крайней мере в один раз. Так, вышеупомянутое не будет автоматически работать после перезагрузки.
Кто вводит пароль? Задание крона не может достигнуть Ваш ssh-агент, таким образом открытый ключ не будет работать.
Необходимо предоставить ssh
с файлом ключей явно (см. -i
опция), так как это не может запросить агент; и тот ключ должен иметь пустой пароль.
/dev/tty
считать пароль вместо stdin
; это не будет работать от крона.
– geekosaur
09.03.2011, 09:57
known_hosts
? Но да, необходимо не упустить полномочия — файл секретных ключей должен быть режимом 0600 или даже 0400, принадлежавший Вам. При необходимости в некотором другом пользователе, чтобы смочь использовать его также, Вы будете иметь, изучают POSIX ACLs или подобный.
– geekosaur
09.03.2011, 10:12
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
.
Вы можете запустить свой скрипт или команду в crontab, например:
0 * * * * bash -c -l "/home/user/sshscript.sh"
или
0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"