Como executar comandos no modo em lote sobre ssh?

9

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

Eu tenho um conjunto de comandos que desejo executar em um conjunto de hosts conectados ssh. Além disso sftp, armazeno os comandos em um arquivo, filenameconecto ao host e executo os comandos usando o comando mencionado anteriormente.

É algo assim possível acabou ssh?

Srikanth
fonte
Eu já passei por essa pergunta. Mas ainda não consegui descobrir como executar os comandos no modo em lote.
Srikanth
E alguém pode criar uma tag #batchmode e marcar essa pergunta para isso?
Srikanth 25/03

Respostas:

9

Me corrija se eu estiver errado, mas você parece querer 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 'execução remota' no meu ambiente de teste usando Python em vez do shell: ssh $userhost python < $pythonscriptfilename.

Arcege
fonte
obrigado pela resposta. Parece com isso. Estou ajustando um pouco e testando agora.
Srikanth 25/03
7

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

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

MattBianco
fonte
3

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

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

E o arquivo em lotes seria um script de shell normal, portanto a sintaxe é bem conhecida.

Johan
fonte
0

man expect? : \

mas não é o caminho perfeito.

LanceBaynes
fonte
Olá johnny8888, estou em um servidor Solaris e não há entrada manual para esperar. Você pode elaborar sua resposta?
Srikanth 25/03
@Srikanth linux.die.net/man/1/expect
Michael Mrozek
@ Krikanth: expectfoi projetado para interagir com programas que esperam estar rodando em um terminal. Isso não tem relação com o problema de executar comandos no ssh.
Gilles 'SO- stop be evil' em
0

possivelmente

ssh user@host sh -c "$(<filename)"
Glenn Jackman
fonte
0

Você pode usar comandos forçados ssh.

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

Faheem Mitha
fonte
0

Outra opção para um script do Arcege seria uma função 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 -Topção ssh , pois ela não funciona em todos os casos.

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

  • "${@:(-1)}" expande para o último parâmetro (literalmente, primeiro forma o fim em diante)
  • "${#@}" expande para o número de parâmetros posicionais
  • "${@:1:${#@}-1}" expande para uma lista de todos os parâmetros do primeiro ao penúltimo (literalmente número de parâmetros menos um).
Gadamiak
fonte
Eu não sou tão bom com expansões variáveis ​​assim, você poderia adicionar um pouco do que está acontecendo? Felicidades.
Guy
@Guy, você está aqui - eu comentei o código e acrescentou alguma explicação sobre expansão de parâmetros
gadamiak