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");
}