Решил обойтись малой кровью, но конструкция, похоже, еще больше усложнилась :(Сам скрипт:
#!/bin/bashserver_list=$1
command_list=$2
log_file="script.log"echo -e "\n============================\n`date`" >>$log_file
for server in `cat $server_list | grep -v ^# | grep -v ^$`; do\
temp=`cat $command_list | grep -v ^# | grep -v ^$ | while read LINE; do \
echo "ssh $server 'hostname; $LINE;' &&"; done`;\
echo $temp; done | fmt;в первую переменную загоняем список серверов
во вторую - список команд, по одной в каждой строке.Проблема в том что никак не могу выполнить конструкцию вида:
ssh srv4.lan 'hostname; top -b -n 1 | head -n 5;'
&& ssh srv5.lan 'hostname; df -h;' &&
из-за того, что уже использовал все спецсимволы...
+ в конце не знаю как поставить пустое echo "done"
В таких случаях нужно использовать экранирование.Также вы можете найти удобным использовать clusterssh:
http://apps.sourceforge.net/mediawiki/clusterssh/index.php?t...
http://citkit.ru/articles/602/
#!/bin/bash
server_list=$1
command_list=$2
log_file="script.log"
echo -e "\n============================\n`date`" >>$log_filegrep -Ev ^[#$] $server_list | while read hostname
do
echo **** $hostname > $log_file.$hostname
grep -Ev ^[#$] $command_list | ssh $hostname >> $log_file.$hostname &
donecat $log_file.* >> $log_file
rm $log_file.*
>[оверквотинг удален]
>grep -Ev ^[#$] $server_list | while read hostname
>do
> echo **** $hostname > $log_file.$hostname
> grep -Ev ^[#$] $command_list | ssh $hostname >> $log_file.$hostname &
>done
>
>cat $log_file.* >> $log_file
>rm $log_file.*
>
>
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile]
[-i identity_file] [-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path]
[-w tunnel:tunnel] [user@]hostname [command]
+ нафига писать в разные логи, а потоп объединять в один?
[...]
>Pseudo-terminal will not be allocated because stdin is not a terminal.Подави с помощью -T
>usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]Возможно кривой/пустой $hostname, сделай bash -x и посмотри что случилось.
>+ нафига писать в разные логи, а потоп объединять в один?Чтобы не перемешивались логи от разных хостов. Обрати внимание на &
Забыл ещё деталь:
[...]
done# Дождаться завершения всех
waitcat $log_file.* >> $log_file
rm $log_file.*
>[оверквотинг удален]
>echo -e "\n============================\n`date`" >>$log_file
>for server in `cat $server_list | grep -v ^# | grep -v
>^$`; do\
> temp=`cat $command_list | grep -v ^# | grep
>-v ^$ | while read LINE; do \
> echo "ssh $server 'hostname; $LINE;' &&"; done`;\
>
> echo $temp; done | fmt;
>
>Не изобретайте велосипед -- apt-cache show dsh
dsh -g <group_of_hosts> "hostname; top -b -n 1 | head -n 5"
>Не изобретайте велосипед -- apt-cache show dsh
>
>dsh -g <group_of_hosts> "hostname; top -b -n 1 | head -n 5"connect to address 10.7.10.101 port 544: Connection refused
Trying krb4 rsh...нужно обойтись стандартным ssh.
>
>>Не изобретайте велосипед -- apt-cache show dsh
>>
>>dsh -g <group_of_hosts> "hostname; top -b -n 1 | head -n 5"
>
>connect to address 10.7.10.101 port 544: Connection refused
>Trying krb4 rsh...
>
>нужно обойтись стандартным ssh.dsh ни что иное как обертка над "стандартным ssh". Connection refused:
telnet 10.7.10.101 544
ssh -p 544 10.7.10.101тоже должны не работать в этом случае.
>[оверквотинг удален]
>>connect to address 10.7.10.101 port 544: Connection refused
>>Trying krb4 rsh...
>>
>>нужно обойтись стандартным ssh.
>
>dsh ни что иное как обертка над "стандартным ssh". Connection refused:
>telnet 10.7.10.101 544
>ssh -p 544 10.7.10.101
>
>тоже должны не работать в этом случае.еще раз говорю:
ssh $server '$command' прекрасно работает
мне не надо юзать rsh
Прочитать man dsh и найти опцию -r слишком сложно для вас? Вам нужно как младенцу все разжевать и в рот положить?
>Прочитать man dsh и найти опцию -r слишком сложно для вас? Вам
>нужно как младенцу все разжевать и в рот положить?Вот так и надо советовать с ключем выше.