我有以下脚本用于收集有关当前登录用户的数据。
#!/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`