无法在 Crontab 中使用 shell 脚本 ssh 到远程计算机

无法在 Crontab 中使用 shell 脚本 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

请给出您的想法......

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

答案1

您可以在 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]

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。如果您注销,这不会杀死它。它的输出是一个有效的 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;

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兼容的,您没有提到您正在使用哪个 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

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

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

答案2

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

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

答案3

find我更喜欢使用在活动代理上进行搜索,而不是像forcefsck那样存储临时文件。

在需要 的脚本主题中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 启动时启动代理)。

如果将其放入另一个脚本中,则需要使用sourceor调用它.,因为它需要设置SSH_AUTH_SOCK变量。

答案4

您可以在 crontab 中运行脚本或命令,例如:

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

或者

0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"

相关内容