Parece que você deseja ssh
em my.host.example.com e, em seguida, o restante do script é executado nesse host. Se esse for o caso, você precisará passar o restante do script como entrada para o comando ssh
; como é agora, ssh
está recebendo entrada do stdin do script que provavelmente está vazio, então ele abre uma sessão de shell remota, envia um final de arquivo, que fecha a sessão ssh
e executa o restante do script localmente . Para executar esses comandos remotamente, você precisa passá-los como entrada para o comando ssh
, algo assim:
ssh -i ~/.ssh/id_rsa [email protected] <<EOF
echo "Extracting generated HTML into www directory..."
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
[...]
exit
EOF
Em segundo lugar, o script não tem verificação de erros. Em geral, é uma boa ideia examinar cada comando em um script e perguntar a si mesmo o que aconteceria se falhasse. Deveria o resto do roteiro continuar, ou seria "fugir dos trilhos" e fazer algo bobo? Por exemplo, se o comando scp
falhar (por qualquer motivo), não há motivo para executar o restante do script (e isso pode ser destrutivo, eliminando / var / www / html / subdir e então substituindo por ... oops, nada). Você pode executar uma verificação de erro no status de saída de cada comando individual, algo como:
scp -i ~/.ssh/id_rsa html.zip [email protected]:/home/user || {
echo "Failed to scp the html files to my.host.example.com." >&2
exit 1
}
... ou use a opção -e
do shell para fazê-lo sair do script se o comando any falhar. Essa opção evita que você tenha que verificar o erro de cada comando individualmente, mas não fornece mensagens de erro informativas e pode causar problemas ao sair do script se algo que não importa retornar um status de erro por algum motivo (consulte BashFAQ # 105 para alguns exemplos de porque -e
pode causar comportamento inesperado). Além disso, se você usar essa opção, use set -e
no início do script (ou use -xe
na linha shebang), e adicione set -e
como primeiro comando enviado para o computador remoto.
BTW, o comando cd
na linha 4 é particularmente provável de falhar, pois usa um caminho relativo. Isso significa que o diretório para o qual ele tenta cd
depende do diretório de trabalho do qual o script foi iniciado. Note que este não é necessariamente o diretório em que o script está, ele é herdado do processo que iniciou o script e, portanto, pode ser quase qualquer coisa. Jenkins pode estar iniciando o script com um diretório de trabalho diferente do seu, fazendo com que ele falhe logo no início. Bem, na verdade não falha, apenas execute todos os comandos restantes no diretório errado (e por causa do problema ssh
input, no host errado).