Como executar comandos no modo batch sobre o ssh?

9

Como posso executar comandos no modo em lote sobre o ssh? Ou seja, qual é o equivalente do ssh do comando sftp -b <filename> <hostname> ?

Eu tenho um conjunto de comandos que desejo executar em um conjunto de hosts que se conectam com ssh . Acima de sftp , eu armazeno os comandos em um arquivo filename e conecto ao host e executo os comandos usando o comando mencionado anteriormente.

É algo assim possível em relação a ssh ?

    
por Srikanth 25.03.2011 / 11:56

7 respostas

9

Corrija-me se estiver errado, mas parece que você está querendo executar comandos regulares do shell no servidor remoto em que o script é local.

#!/bin/sh
trap "rm -f /tmp/sendonssh.$$.*" 0 1 2 3 15
# commands to run on the remote server
cat <<'EOF' >> /tmp/sendonssh.$$.sh
mkdir -p /tmp/foobar.$$
mv $HOME/xyzzy /tmp/foobar.$$
chmod 640 $HOME/xyzzy
EOF
# call for each argument
for userhost in "$@"; do
    errorout='ssh -aTxo BatchMode=yes $userhost /bin/sh -s < /tmp/sendonssh.$$.sh 2>&1'
    rc=$?
    if [ $rc -ne 0 ]; then
        echo "Error: $userhost: $errorout"
        exit $rc
    fi
done

Eu faço isso com alguns aplicativos de "execução remota" no meu ambiente de teste usando Python em vez do shell: ssh $userhost python < $pythonscriptfilename .

    
por 25.03.2011 / 12:21
6

O equivalente em SSH de sftp -b <filename> <hostname> seria:

ssh -o BatchMode=yes <hostname> sh -s < "<filename>"

    
por 28.03.2011 / 09:57
1

Que tal mantê-lo simples e executar o arquivo "batch" no outro computador?

  1. usuário do arquivo em lote scp @ pc
  2. ssh user @ pc arquivo em lote
  3. usuário do ssh @ pc rm batch-file

E o arquivo em lote seria um script de shell normal, então a sintaxe é bem conhecida.

    
por 27.03.2011 / 09:11
0

man expect ? : \

mas não é o caminho perfeito.

    
por 25.03.2011 / 12:05
0

talvez

ssh user@host sh -c "$(<filename)"
    
por 25.03.2011 / 14:38
0

Você pode usar comandos forçados ssh.

Estes estão associados a uma chave particular. Quando uma autenticação é feita com essa chave, esse comando é executado e a conexão é encerrada. Uma vantagem dessa abordagem é aumentar a segurança, pois, nesse caso, a chave não pode ser usada para acessar um shell de login.

    
por 25.03.2011 / 18:55
0

Outra opção para um script do Arcege seria uma função de Bash:

sshbatch() {
  # Expect at least 2 parameters, if less are provided print help
  if [[ ${#@} -lt 2 ]]; then
    printf 'Usage: sshbatch [user@]host... input_file\n'
  else
    while read -r -u "$fd" host; do
      # Check if the last parameter is a readable file, else print error and exit
      [[ -r ${@:(-1)} ]] || { printf "The file ${@:(-1)} is not readable!\n"; break; }
      # Run remote bash from the file given in the last parameter
      ssh -o BatchMode=yes "$host" bash -s < "${@:(-1)}"
      # Read host list from 1st to next to last parameters
    done {fd}< <(printf '%s\n' "${@:1:${#@}-1}")
  fi
}

Eu não uso a opção -T do ssh, pois ela não funciona com ele em todos os casos.

Este script usa expansão de parâmetro na matriz de parâmetros posicionais $@ :

  • "${@:(-1)}" se expande para o último parâmetro (literalmente, primeiro formando o final em diante)
  • "${#@}" se expande para o número de parâmetros posicionais
  • "${@:1:${#@}-1}" se expande para uma lista de todos os parâmetros, do primeiro ao próximo ao último (literalmente, o número de parâmetros menos um).
por 02.02.2018 / 13:43