Script de shell: ssh para máquina remota e saia: 'exit' não funciona

Script de shell: ssh para máquina remota e saia: 'exit' não funciona

Eu tenho um script de shell do seguinte tipo:

#!/bin/bash

ssh [email protected]
echo "Hi"
exit

Eu executo-o localmente para fazer algo em um servidor remoto (representado por 'echo "Hi"'). No entanto, quando o executo, vejo o prompt no servidor remoto – portanto, o comando ‘exit’ não é executado. Quando digito manualmente 'exit' no prompt remoto, vejo "Conexão com myremotemachine.com" fechado eentão "Oi". Como posso configurar o script de shell para que ele saia corretamente e me mostre o prompt (local) a partir do qual o executei?

https://unix.stackexchange.com/questions/89747/ssh-exits-after-quit-case-in-bash-scriptessh e shell através de ssh: como sair?parecem um tanto relacionados, mas não consegui adaptar as ideias ali apresentadas./

ATUALIZAR

A versão a seguir, não tão mínima, leva a Unmatched '..

#!/bin/bash

date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] bash -c "'
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
exit
'"

Se eu remover as aspas duplas neste trecho, recebo: bash: -c: option requires an argumentedate: Undefined variable.

Responder1

Isso deve resolver seu problema.

ssh [email protected] << HERE
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
HERE

Ou você pode fazer o seguinte. Coloque todos os comandos que deseja executar no host remoto em um script separado. Dê um nome como remote.sh

Agora execute o seguinte

ssh [email protected] 'bash -s' < /path/to/remote.sh

Onde remote.sh contém.

rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup

Responder2

Você pode fazer

$ssh user@comp echo abc<ENTER>

então ele executará esse comando (emitindo abc) e sairá

Responder3

Talvez você não tenha nenhuma nova linha no final do script?

Se não houver nenhuma linha vazia (exatamente LF- caractere de alimentação de linha) após a saída - seu script não "pressionará enter" programaticamente.

Responder4

Embora a resposta de Barlops esteja correta, acho que podemos expandi-la para torná-la mais clara. Como você parece estar usando um script, sugiro algo assim:

#!/bin/bash

ssh [email protected] "echo Hi\!"

Leitura extra: sugiro também que você também procure caracteres especiais e quando precisar escapá-los, pois o bash analisará automaticamente os pontos de exclamação, quando estiverem entre aspas duplas. Você pode resolver isso usando aspas simples ou a barra invertida para 'escapar'.

Editar:

#!/bin/bash
date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] '
date=`date "+%Y-%m-%d"`
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
'

Quando tentei uma versão simplificada, a variável date funcionou sem problemas, talvez isso corrija o problema bash -c que você estava tendo. Além disso, a saída é desnecessária no final, quando o último comando é executado a sessão ssh é automaticamente fechada.

informação relacionada