cronセッション内でssh接続を行うことができます。パスワードなしでアクセスできるように公開鍵認証を設定する必要があります。これが機能するためにはPubkeyAuthentication yes
、各リモートサーバーにが必要sshd_config
です。
パスフレーズの有無にかかわらず、秘密鍵と公開鍵のペアを作成できます。パスフレーズ(推奨)を使用する場合は、ssh-agentも起動する必要があります。パスフレーズがない場合は、コマンドラインにパラメーター-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-agentを実行します-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
パスフレーズを使用する場合の唯一の問題は、少なくとも1回は手動で入力する必要があることです。したがって、上記は再起動後に自動的に機能しません。