下面是我尝试运行的脚本,运行没有任何问题
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_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
。如果您注销,这不会杀死它。它的输出是一个有效的 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 启动时启动代理)。
如果将其放入另一个脚本中,则需要使用source
or调用它.
,因为它需要设置SSH_AUTH_SOCK
变量。
答案4
您可以在 crontab 中运行脚本或命令,例如:
0 * * * * bash -c -l "/home/user/sshscript.sh"
或者
0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"