Crontabのシェルスクリプトを使用してリモートマシンにsshできない


11

以下は、私が実行しようとしているスクリプトで、問題なく実行されます

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デーモンが実行されている可能性があるため、いくつかのバイナリを含める必要があります...?


1
権限が拒否されました(publickey、gssapi-keyex、gssapi-with-mic、password)。権限が拒否されました(publickey、gssapi-keyex、gssapi-with-mic、password)。権限が拒否されました(publickey、gssapi-keyex、gssapi-with-mic、password)。

これに対するあなたの意図は何ですか?何を達成しようとしているのですか。それがあなたの意図である場合、私たちは悪意のある活動を支援することができないことを知っているだけです
Timothy Frew

回答:


14

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回は手動で入力する必要があることです。したがって、上記は再起動後に自動的に機能しません。


素晴らしい-ありがとう。少なくとも今のところ、再起動後の自動再起動はありません。
Peter Mounce

ssh-cronを使用して、SSHキーを公開せずにSSHエージェントを使用して、サーバーを保護するためにスケジュールされたSSH接続をセットアップします。unix.stackexchange.com/questions/8903/...
Luchostein

4

誰がパスワードを入力しますか?cronジョブがssh-agentに到達できないため、公開鍵は機能しません。

エージェントにクエリを実行できないためssh、キーファイルを明示的に指定する必要があります(-iオプションを参照)。そしてそのキーに空のパスフレーズが必要です。


ユーザー名とパスワードも渡してみました-ssh -t -t -o ConnectTimeout = 60 user @ machine $ 1 finger | 尾-1 | awk '{print $ 1}' </ home / user / passwd ----つまり、ホームディレクトリがNFS上にあるため、everymachineにマウントされます

sshに意味がある場合は/dev/tty、パスワードの読み取りにの代わりに使用していますstdin。これはcronでは機能しません。
ギーコサウルス2009年

-iオプションを与えようとしたが運が悪かった!---- ssh -o ConnectTimeout = 60 -i /home/subrahmanyam/.ssh/known_hosts machine $ 1 finger | 尾-1 | awk '{print $ 1}' ------警告:保護されていないプライベートキーファイル!'/home/user/.ssh/known_hosts'の権限0640がオープンされすぎています。秘密鍵ファイルには他人がアクセスできないようにすることをお勧めします。この秘密鍵は無視されます。不正な権限:キーを無視:

なぜ不満を言うのknown_hostsですか?しかし、はい、権限に注意する必要があります。秘密鍵ファイルは、自分が所有するモード0600または0400にする必要があります。他のユーザーもそれを使用できるようにする必要がある場合は、POSIX ACLまたは同様のものを調べる必要があります。
ギーコサウルス2009年

考えてみると、GSSAPIが提供されていることがわかりました。そのため、別の可能性として、キータブを取得しkinitてcronジョブ内で使用することが考えられます。とはいえ、キータブにも権限と同じ配慮が必要です。しかしssh、少なくともそれらについて不満はありません。
ギーコサウルス

1

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ます。


0

ssh-cronを使用して、SSHキーを公開せずにSSHエージェントを使用して、サーバーを保護するためにスケジュールされたSSH接続をセットアップします。


0

次のようにcrontabでスクリプトまたはコマンドを実行できます。

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

または

0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.