Estou preso com este pedaço de código aqui
user@server:~$ TEST="ssh [email protected] 'date; hostname -A; uname -a'"
user@server:~$ $TEST
bash: date; hostname -A; uname -a: Command not found.
Eu quero usar isso dentro de um script de shell e não sei qual é o problema.
Ambos os sistemas são debian wheezy,
mas se executar o comando diretamente:
user@server:~$ ssh [email protected] 'date; hostname -A; uname -a'
Fre Aug 23 20:02:55 CEST 2013
otherserver.example.org
Linux otherserver 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux
Então, qual é o grande problema aqui ??
Eu relay estou perdendo algo muito trivial, mas apenas não consigo descobrir ...
Por favor ajude ...
A idéia por trás disso é que eu construo uma longa string dentro de um script e a executo remotamente em uma única sessão SSH (renomeando zfs snapshots todos em uma linha n.0 se torna n.1 e assim por diante)
Mas não funciona, quer que funcione ...
EDIT / UPDATE: Atualizado os exemplos para melhor compreensão da minha pergunta (de 'data; data; data' TO 'date; hostname -A; uname -a')
Obrigado por todas as respostas até agora.
No primeiro eval funciona, mas parece ser preterido como mencionado pelos usuários.
Então é meu trabalho descobrir isso de novo em como mudar isso.
A string que ele deve ser construída é semelhante a esta:
echo "Rearanging snapshots..."
last_backup=7
first_backup=0
RENAME_STRING="'sudo zfs destroy $BACKUP_DATASTORE@n.$last_backup; "
while [ $last_backup -gt $first_backup ]
do
RENAME_STRING=$RENAME_STRING"sudo zfs rename $BACKUP_DATASTORE@n.$(($last_backup - 1)) $BACKUP_DATASTORE@n.$last_backup"
if [ $(($last_backup - 1 )) -gt $first_backup ]
then
RENAME_STRING=$RENAME_STRING"; "
else
RENAME_STRING=$RENAME_STRING"'"
fi
last_backup=$(($last_backup - 1 ))
done
#CURRENTLY SOLVED WITH EVAL as this one doesn't work...
#remote_cmd=(/usr/bin/ssh "$BACKUP_USER@$HOST_TO" "$RENAME_STRING")
#"${remote_cmd[@]}"
eval /usr/bin/ssh $BACKUP_USER@$HOST_TO $RENAME_STRING
Então talvez vocês tenham uma maneira mais elegante de resolver isso?
EDIT2:
Esta saída é "OK"? (OK, como nos meios de não preterido, e bom trabalhar com?
user@server:~$ TEST="date ; hostname -A ; uname -a"
user@server:~$ ssh [email protected] <<< "$(printf '%s ' $TEST)"
Pseudo-terminal will not be allocated because stdin is not a terminal.
Linux otherserver 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Fre Aug 23 20:13:53 CEST 2013
otherserver.example.org
Linux otherserver 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux
EDI3: Atualizado / aprimorado (?) enquanto o loop eval ainda é usado como < < < não vai funcionar no script ...