como usar o comando ssh para conectar-se a vários computadores e enviar comandos diferentes para cada computador ao mesmo tempo

1

Eu preciso conectar vários computadores para executar programas diferentes. Para computadores diferentes, preciso enviar um comando diferente. Como usar o comando ssh para se conectar a vários computadores e enviar comandos diferentes para cada computador? Meu comando para executar o programa para cada computador é %código%. Para ser detalhado. Eu quero usar 3 computadores para executar 3 programas. Então, vou mandar

nohup Rscript program_i.R > program_i_out.txt para o primeiro computador,

nohup Rscript program_1.R > program_1_out.txt para o segundo computador,

nohup Rscript program_2.R > program_2_out.txt para o terceiro computador.

    
por Mike Brown 15.04.2015 / 00:49

2 respostas

1

Experimente ssh -f user@host '<your command here>' .

Da página de manual do ssh:

-f Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background.

Por exemplo, se eu fizer ssh -f <my computer> 'echo "hello $(pstree -p | grep sshd | wc -l) person in ssh!" , ele imprime hello 1 person in ssh! .

Depois de imprimir 2, a sessão sai automaticamente, mas você não precisa esperar que ela saia. Se eu fizer ssh -f <my computer> 'sleep 30 && echo "hello $(pstree -p | grep sshd | wc -l) person in ssh!"' , parece que nada aconteceu e posso fazer qualquer coisa normalmente, mas 30 segundos depois, imprime hello 1 person in ssh! .

Usar o > redirect redirecionará todos os stdout para um arquivo, mas todos os erros ainda serão impressos na tela. Para evitar isso, você pode usar &> para redirecionar todas as saídas, stdout e stderr, para um arquivo.

Espero que isso ajude!

    
por 15.04.2015 / 01:26
0

O SSH pode ser chamado de algumas maneiras. A maneira mais comum pelas quais as pessoas invocam é usar:

ssh user@host

Isso abre um terminal interativo. No entanto, o SSH nos bastidores tem um estilo de chamada mais parecido com isso:

ssh user@host /usr/bin/foo

Então, o primeiro tipo basicamente apenas conectando e executando o bash para você é uma conveniência. É basicamente fazendo isso por você:

ssh user@host sh

Em que sh é o shell desse sistema, que provavelmente é bash .

Para fins de argumentação, vamos supor que seu comando que você precisa executar seja mycommand .

(O motivo que eu estou simplificando isso é porque o comando que você deu como exemplo contém nohup e redirecionamento de saída, o que significa que você precisa escapar corretamente do comando. Além disso, se você estiver usando nohup em um esforço para Para que o comando permaneça ativo após o término da conexão SSH, você provavelmente desejará usar setsid para torná-lo um líder de sessão. Em ambos os casos, você também fará um comando assíncrono usando & )

For different computers, I need to send them different command.

Você não especificou como deseja fazer isso. Por exemplo, a máquina iniciando a conexão SSH é aquela que decide qual comando é executado ou é especificada por uma configuração na máquina remota?

Se a sua máquina que inicia as conexões com várias máquinas remotas é a que deve decidir qual comando é gravado, você precisa armazenar essas informações em algum lugar e usá-las.

Uma forma de fazer isso seria canalizar dados para o SSH, já que, por padrão, ele invocaria bash , que será lida na entrada padrão:

cat command.txt | ssh user@host

Eu usei cat comand.txt como um exemplo aqui que gera qual comando deve ser enviado para o SSH, porque não tenho idéia de como você está salvando essa informação agora. Pode ser mais fácil armazenar todas as informações em um arquivo de texto como este:

user  host  command
user2 host2 command2
user3 host3 command3

Agora você pode criar um canal que o faça, embora seja um pouco complicado (você precisará usar um analisador parecido com sed ou awk ). Pode ser mais fácil usar uma linguagem de script leve como Perl ou PHP:

<?php

foreach (file('myfile.txt') as $line) {
    list($user, $host, $command) = explode(' ', $line);
    passthru("ssh $user@$host $command");
}
    
por 15.04.2015 / 01:16