启动后带有 ssh 的 Cron 作业不工作

启动后带有 ssh 的 Cron 作业不工作

我有以下脚本用于收集有关当前登录用户的数据。

#!/bin/bash
# Collecting users login statistics

CURRENT_ALL_USERS="path_to_log_file"
ADMIN="path_to_admin_dir"
STATIONS="$ADMIN/stations_list"
ALL_USERS_IN_STATIONS=0

eval `keychain --eval ~/.ssh/id_rsa`

for STATION in `cat $STATIONS`; do
    TEMP_VAR=`ssh user@$STATION who | cut -d " " -f1 | sort -u | wc -l`
    USERS_IN_STATION=$TEMP_VAR
    let ALL_USERS_IN_STATIONS="$ALL_USERS_IN_STATIONS+$USERS_IN_STATION"
done

echo $ALL_USERS_IN_STATIONS > $CURRENT_ALL_USERS

使用 cronjob 定期运行:

 * * * * * /path_to_script/script.sh

当服务器重新启动时,脚本无法 ssh 到远程站,我需要第一次手动运行该脚本。

我该怎么做才能使脚本在重启后工作而无需第一次手动运行它?

答案1

第一次手动运行脚本时,它有什么不同?尝试手动首次运行bash -x script.sh,看看其中是否有任何有用的东西。

$CURRENT_ALL_USERS写入哪个目录?

哦,这可能是你的问题,从钥匙扣(1)手册页:

当 keychain 运行时,它会检查是否有正在运行的 ssh-agent,否则会启动一个。它会将 ssh-agent 环境变量保存到 ~/.keychain/${ HOSTNAME }-sh,以便后续登录和非交互式 shell(如 cron 作业)可以获取该文件并建立无密码 ssh 连接。此外,当 keychain 运行时,它会验证命令行上指定的密钥文件是否为 ssh-agent 所知,否则会加载这些文件,并在必要时提示您输入密码。

keychain 在第一次运行时会进行一些特殊处理,特别是启动 ssh-agent。因此,从 cron 运行时 ssh-agent 必定会失败,但手动运行脚本时 ssh-agent 会正常工作。

我建议您考虑设置一个特殊用户来运行此检查和/或一组特殊的私钥/公钥。不要在该密钥对上设置密码。然后,您可以摆脱整个钥匙串,直接在脚本中使用这些密钥,而不必担心使用钥匙串、ssh-agent、ssh-add 等加载密钥。

另外,另外顺便说一句,这个脚本的一个巧妙的改进是使用 bash 数组来收集所有登录用户的信息,而不是像现在这样附加到字符串。

答案2

导出HOME=/root

您可能缺少 ssh 使用并由 ~ 引用的 HOME

eval `keychain --eval ~/.ssh/id_rsa`

相关内容