Crontabのシェルスクリプトを使用してリモートコンピュータにSSH経由で接続することはできません。

Crontabのシェルスクリプトを使用してリモートコンピュータにSSH経由で接続することはできません。

以下は実行しようとしたスクリプトで、問題なく実行されました。

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

あなたの考えを聞いてください...

クローンの悪魔が走っているので、いくつかのバイナリを含める必要があるかもしれません...?

ベストアンサー1

cron セッションで SSH 接続を確立できます。必要なのは、パスワードのないアクセス用に公開鍵認証を設定することです。PubkeyAuthentication yesこれを行うにはsshd_config

パスワードを使用または使用せずに秘密鍵と公開鍵のペアを生成できます。パスワードを使用する場合(推奨)、ssh-agentも起動する必要があります。パスワードがない場合は、単にコマンドライン-i your_identity_fileにパラメータを追加できます。デフォルトとして使用されます。sshssh$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

sh7)私のcrontab(実際に私のcrontabは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

パスワードを使用する際の唯一の問題は、パスワードを複数回手動で入力する必要があることです。したがって、再起動後、上記の内容は自動的には機能しません。

おすすめ記事