Pessoalmente, penso em toda a ideia de pedir repetidamente "Reconectar?" é uma abominação que, na melhor das hipóteses, duplica inutilmente o histórico de comandos do seu shell, mas muito, muito pior. Sério, como é difícil executar ssh root@remotehost tail -f /var/log/dp.log
e, em seguida, pressionar Seta para cima Enter se você quiser executá-lo novamente? ou apenas escreva algumas funções de shell ou minúsculos scripts se você não quiser digitar o comando inteiro uma única vez (veja abaixo exemplos).
Dito isto, aqui está uma maneira melhor de fazer o que você está tentando fazer:
#!/bin/bash
error() {
local ec msg
ec="$1" ; shift
msg="$*"
[ -n "$msg" ] && echo "$msg" >&2
[ "$ec" != 0 ] && exit "$ec"
}
[ -z "$1" ] && error 1 "first argument missing. must be hostname"
echo "$1"
myssh() {
local remote reconnect quit
remote="$1" ; shift
quit=0
while [ $quit != 1 ] ; do
ssh -o StrictHostKeyChecking=no -p 2222 "$remote" "$@"
read -p "Reconnect (Y/n) [Y]? " reconnect
[[ $reconnect =~ ^[Nn] ]] && quit=1
done
}
case "$2" in
cat|log) myssh "root@$1" cat /var/log/dp.log ;;
tail) myssh "root@$1" tail -f /var/log/dp.log ;;
"") myssh "root@$1" ;;
*) error 1 "Unknown second argument '$2'" ;;
esac
Aqui está uma maneira ainda melhor de fazer isso.
Adicione ~ / bin ao seu $ PATH e então crie os seguintes scripts (não esqueça de torná-los executáveis com chmod +x
)
~ / bin / myssh.sh:
#!/bin/sh
[ -z "$1" ] && echo hostname is required && exit 1
remote="$1" ; shift
ssh -o StrictHostKeyChecking=no -p 2222 "root@$remote" "$@"
~ / bin / remote-cat.sh:
#!/bin/sh
myssh.sh "$1" cat /var/log/dp.log
~ / bin / remote-tail.sh:
#!/bin/sh
myssh.sh "$1" tail -f /var/log/dp.log
Execute esses itens conforme necessário. Use o histórico de comandos do seu shell para executá-los novamente quantas vezes quiser.
myssh.sh
pode ser usado para obter um shell de login raiz no host remoto AND (conforme demonstrado pelos outros dois scripts) para executar quaisquer comandos arbitrários como root no host remoto. / p>