Script de shell: ssh para a máquina remota e, em seguida, sair: 'exit' não funciona

2

Eu tenho um script de shell do seguinte tipo:

#!/bin/bash

ssh [email protected]
echo "Hi"
exit

Eu corro localmente para fazer algo em um servidor remoto (representado por 'echo' "Oi"'). No entanto, quando eu o executo, vejo o prompt no servidor remoto - para que o O comando 'exit' não é executado. Quando eu digito manualmente 'exit' no controle remoto prompt, vejo então "Connection to myremotemachine.com" fechado e então "Oi". Como posso configurar o shell script de forma que ele saia corretamente e mostre me o prompt (local) do qual eu o executei?

link e ssh e shell através do ssh: como sair? parece um pouco relacionado, mas eu couldn adapte as ideias ali apresentadas ./

UPDATE

A seguinte versão, 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 snippet, obtenho: bash: -c: option requires an argument e date: Undefined variable.

    
por Marius Hofert 07.09.2014 / 00:10

4 respostas

7

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 você 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 o remote.sh contém.

rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
    
por 08.09.2014 / 05:51
1

Você pode fazer

$ssh user@comp echo abc<ENTER>

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

    
por 07.09.2014 / 02:11
1

Talvez você não tenha uma nova linha no final do roteiro?

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

    
por 07.09.2014 / 02:23
1

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

#!/bin/bash

ssh [email protected] "echo Hi\!"

Leitura extra: Eu também sugiro que você também procure em caracteres especiais e quando precisar deles, pois o bash analisará automaticamente pontos de exclamação, quando entre aspas duplas. Você pode resolver isso usando aspas simples ou o caractere de 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 eu tentei uma versão simplificada, a variável date funciona sem problema, 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.

    
por 07.09.2014 / 02:20