无法使用Crontab中的Shell脚本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 demon正在运行,所以我们需要包含一些二进制文件...?


1
权限被拒绝(公钥,gssapi-keyex,gssapi-with-mic,密码)。权限被拒绝(公钥,gssapi-keyex,gssapi-with-mic,密码)。权限被拒绝(公钥,gssapi-keyex,gssapi-with-mic,密码)。

您对此有何看法?您想达到什么目的。只要您知道这是您的意图,我们就无法协助进行任何恶意活动
Timothy Frew

Answers:


14

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

使用密码短语的唯一问题是,您需要至少手动输入一次。因此,以上内容在重启后将无法自动运行。


太好了-谢谢。至少现在,我可以在重启后不自动重启。
彼得·蒙斯

使用ssh-cron可以建立到安全服务器的计划SSH连接,而无需使用SSH代理,而是使用SSH代理。unix.stackexchange.com/questions/8903/…–
卢舒斯坦,

4

谁输入密码?Cron作业无法通过您的ssh-agent获得,因此公用密钥将无法使用。

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


也尝试通过传递用户名和密码-ssh -t -t -o ConnectTimeout = 60 user @ machine $ 1 finger | 尾巴-1 | awk'{print $ 1}'</ home / user / passwd ----我的意思是主目录位于NFS上,因此它挂载到每台计算机上

如果ssh有任何意义,则它/dev/tty用于读取密码,而不是stdin; 从cron无法正常工作。
geekosaur 2011年

试图给-i选项,但没有运气!---- ssh -o ConnectTimeout = 60 -i /home/subrahmanyam/.ssh/known_hosts机器$ 1手指| 尾巴-1 | awk'{print $ 1}'------警告:不受保护的私钥文件!'/home/user/.ssh/known_hosts'的权限0640太开放。建议他人不能访问您的私钥文件。此私钥将被忽略。错误的权限:忽略密钥:

为什么抱怨known_hosts呢?但是,是的,您需要注意权限-私钥文件应为模式0600甚至0400,归您所有。如果您还需要其他用户才能使用它,则可以查看POSIX ACL或类似的内容。
geekosaur 2011年

想一想,我看到那里提供了GSSAPI,所以另一种可能性是获取密钥表并将其用于kinitcron作业中。也就是说,键表在权限方面也需要同样的照顾。但ssh至少不会抱怨他们。
geekosaur 2011年

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套接字并返回第一个套接字。它仅限于当前用户,因此您不会意外地尝试使用其他用户并获得权限被拒绝的错误。您还需要已经使用active登录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'"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.