以下は、私が実行しようとしているスクリプトで、問題なく実行されます
for i in `seq 200 2100`
do
usr=(`ssh -t -t -o ConnectTimeout=60 machine$1 finger | tail -1 | awk '{print$1}'`)
echo $usr
done
しかし、それをcrontabに追加すると、ユーザーに表示されません。
22 12 * * * sh /home/subrahmanyam/Scripts/who.sh
あなたの考えを教えてください.....
cronデーモンが実行されている可能性があるため、いくつかのバイナリを含める必要があります...?
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)_-s
_を使用してssh-agentをサービスとして実行します。ログアウトしてもこれは強制終了されません。その出力は有効なシェルスクリプトであり、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回は手動で入力する必要があることです。したがって、上記は再起動後に自動的に機能しません。
誰がパスワードを入力しますか? cronジョブがssh-agentに到達できないため、公開鍵は機能しません。
ssh
にキーファイルを明示的に指定する必要があります(-i
オプション)、エージェントにクエリを送信できないため。そしてそのキーmustには空のパスフレーズがあります。
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はGUIの起動時にエージェントを起動します)。
これを別のスクリプトに入れる場合は、.
変数を設定する必要があるため、source
またはSSH_AUTH_SOCK
で呼び出す必要があります。
ssh-cron を使用して、SSHキーを公開せずにSSHエージェントを使用して、サーバーを保護するためにスケジュールされたSSH接続をセットアップします。
次のようにcrontabでスクリプトまたはコマンドを実行できます。
0 * * * * bash -c -l "/home/user/sshscript.sh"
または
0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"