无法在 Crontab 中使用 shell 脚本通过 ssh 连接到远程机器

11 shell ssh authentication cron

下面是我试图运行的脚本,它运行没有任何问题

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
Run Code Online (Sandbox Code Playgroud)

但是一旦我将它添加到 crontab,它就不会给我用户。

22  12  *  *  *  sh /home/subrahmanyam/Scripts/who.sh
Run Code Online (Sandbox Code Playgroud)

请给出你的想法......

可能是 cron Demon 正在运行,所以我们需要包含一些二进制文件......?

for*_*sck 15

您可以在 cron 会话中建立 ssh 连接。您需要的是设置公钥身份验证以进行无密码访问。为此,您需要PubkeyAuthentication yes在每个远程服务器的sshd_config.

您可以创建带有或不带有密码短语的私钥/公钥对。如果您使用密码(推荐),您还需要启动 ssh-agent。没有密码,您只需要-i your_identity_filessh命令行中添加参数即可。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]
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

3) 将 ssh-agent 作为服务运行-s。如果您注销,这不会杀死它。它的输出是一个有效的 shell 脚本,设置环境以便 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;
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

6)我使用的脚本,比你的略有修改。请注意,我没有将 ssh 命令括在括号中,也没有使用反引号$(),这是命令替换的更好选择(这是bash兼容的,您没有提到您使用的是哪个 shell)。我使用了与您完全相同的 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
Run Code Online (Sandbox Code Playgroud)

7)我的crontab(注意我sh的实际上是bash

john@coffee:~$ crontab -l
# m h  dom mon dow   command
*/1  *  *  *  *  sh /home/john/foo.sh
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

使用密码短语的唯一问题是您需要至少手动输入一次。因此,重启后上述内容不会自动工作。


gee*_*aur 4

谁输入密码?cron 作业无法访问您的 ssh 代理,因此公钥不起作用。

您需要ssh显式提供密钥文件(请参阅-i选项),因为它无法查询代理;并且该密钥必须有一个空密码。