Когда вы блокируете с помощью Ctrl+Alt+L, скорее всего, вы просто включаете приложение-заставку, которое также запрашивает пароль. Я думаю, что автоматического способа нет, если только вы не настроите приложение экранной заставки, чтобы отследить это.
Например, можно создать сценарий-обертку, который будет регистрировать время и запускать экранную заставку, а также регистрировать время, когда она завершится, хотя это и не тривиально.
Циклический просмотр группы серверов, на которых нет ключей, потребует циклического просмотра файла с вашими паролями либо в виде открытого текста, либо в простом шифровании. Я бы настоятельно не рекомендовал делать это лично, особенно если это происходит в производственной среде.
Быстрое и грязное решение можно найти с помощью sshpass
и текстового файла, содержащего имена хостов ваших серверов с их паролями:
пример serverList.txt:
server1 password1
server2 password2
действительно пример небезопасного скрипта:
for host in $(awk '{print $1}' serverList.txt); do
password=$(grep -w "$host" serverList.txt | awk '{print $2}')
sshpass -p "$password" ssh $host <./script.sh
done
Если это то, что вам нужно делать регулярно, я бы рекомендовал изучитьdsh
(распределенную оболочку ).
Установить его из Debian/Ubuntu очень просто:
sudo apt-get install dsh
для дистрибутивов на основе RHEL вам необходимо сначала скомпилировать libdshconfig
, а затемdsh
:
# libdshconfig
wget http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.10.cvs.1.tar.gz
tar xfz libdshconfig*.tar.gz
cd libdshconfig-*
./configure ; make
make install
# dsh
wget http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.22.0.tar.gz
tar xfz dsh-0.22.0.tar.gz
cd dsh-*
./configure ; make
make install
Конфигурация для dsh
по умолчанию будет использовать rsh
в качестве протокола входа в систему. Вы, вероятно, захотите изменить это на ssh
, так как rsh
не зашифровано.
при установке через apt
файл конфигурации будет /etc/dsh/dsh.conf
-, если вам пришлось скомпилировать его для дистрибутивов на основе RHEL, то файл конфигурации будет/usr/local/etc/dsh.conf
обновить это:
remoteshell =rsh
к этому:
remoteshell =ssh
После того, как вы это сделаете, вам понадобится список машин, на которых вы хотите что-то запускать. Для Debian этот файл будет /etc/dsh/machines.list
,для RHEL это будет/usr/local/etc/dsh/machines.list
Список может быть представлен в виде имени хоста, IP-адреса или полного доменного имени, разделенных новой строкой. Например, это будет действительный файл machines.list
, если все имена хостов или полные доменные имена разрешаются:
10.20.30.40
10.20.30.31
server1.stackexchange.com
server2
root@myOtherServer
Теперь вы можете запускать команды последовательно или параллельно на нескольких хостах вmachines.list
Последовательно, только с обратным выходом:
dsh -a <command>
$ dsh -a echo hello
hello
hello
печатать каждое имя хоста в качестве префикса для соответствующего вывода:
dsh -a -M <command>
$ dsh -a -M echo hello
root@server1: hello
root@server2: hello
сделайте то же самое, но вместо последовательного запуска команды одновременно:
dsh -aMc <command>
использовать только выбранные хосты:
dsh -Mc -m <host1> -m <host2> <command>
Таким образом, проблема с этим в вашем сценарии заключается в том, что вам потребуется настроить ключи ssh (, если вы не хотите вводить пароль для каждого хоста ), и вам также понадобится сценарий на каждом из хосты.
Лично я бы сказал, что это будет лучший и самый безопасный способ запустить его в любом случае, в зависимости от размера скрипта, так как вам не нужно передавать скрипт по ssh для каждого хоста, все они могут запускать скрипт локально.