我有以下脚本收集有关当前logging的用户的数据。
#!/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到远程站,我需要手动运行脚本第一次。
我可以做什么使脚本在重新启动后工作,而无需第一次手动运行它?
当您第一次手动运行脚本时,它有什么不同? 尝试使用bash -x script.sh进行手动首次运行,并查看是否有任何有用的内容。
什么目录是$CURRENT_ALL_USERS写入?
哦,这可能是你的问题,从钥匙链(1)的 manpage:
当钥匙串运行时,它检查正在运行的ssh-agent,否则启动一个。 它将ssh-agent环境variables保存为〜/ .keychain / $ {HOSTNAME} -sh,以便后续login和非交互式shell(例如cron作业)可以源文件并build立无密码的ssh连接。 另外,当钥匙串运行时,它会validation在命令行中指定的密钥文件是否为ssh-agent所知,否则会加载它们,如有必要,提示您input密码。
keychain在第一次运行时会进行特殊的处理,特别是启动ssh-agent。 因此,从cron运行ssh-agent必须失败,但在手动运行脚本时工作。
我build议你考虑设置一个特殊用户来运行这个检查和/或一组特殊的私钥/公钥。 不要在密钥对上input密码。 然后,你可以摆脱整个钥匙串的事情,只是直接在脚本中使用这些键,而不必担心用钥匙串,ssh-agent,ssh-add等加载密钥。
另外作为另一个随机放在一边,这个脚本的一个整洁的细化将是使用bash数组来收集所有login的用户信息,而不是追加到像你现在正在做的string。
导出HOME = / root
你可能会遗漏被ssh使用的HOME,并且被〜所引用
eval `keychain --eval ~/.ssh/id_rsa`