У меня есть следующий скрипт, собирающий данные о текущих зарегистрированных пользователях.
#!/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) страница руководства:
Когда связка ключей запущена, она проверяет наличие запущенного ssh-агента, в противном случае запускает его. Он сохраняет переменные среды ssh-agent в ~ / .keychain / $ {HOSTNAME} -sh, чтобы последующие входы в систему и неинтерактивные оболочки, такие как задания cron, могли получить файл и установить ssh-соединения без пароля. Кроме того, при запуске связки ключей он проверяет, известны ли файлы ключей, указанные в командной строке, ssh-agent, в противном случае он загружает их, при необходимости запрашивая пароль.
keychain выполняет специальную обработку при первом запуске, в частности, запускает ssh-agent. Таким образом, ssh-agent должен давать сбой при запуске из cron, но работать, когда сценарий запускается вручную.
Я предлагаю вам рассмотреть возможность создания специального пользователя для выполнения этой проверки и / или специального набора закрытых / открытых ключей. Не ставьте пароль на эту пару ключей. Затем вы можете избавиться от всей этой связки ключей и просто использовать эти ключи непосредственно в скрипте, не беспокоясь о загрузке ключей с помощью связки ключей, ssh-agent, ssh-add и т. Д.
Кроме того, в качестве еще одного случайного дополнения, аккуратным уточнением этого скрипта было бы использование массива bash для сбора всей информации вошедшего в систему пользователя вместо добавления к строке, как вы делаете сейчас.
экспорт HOME = / root
Вероятно, вам не хватает HOME, который используется ssh и на который ссылается ~
eval `keychain --eval ~/.ssh/id_rsa`