Iterm2: Automatize o envio de texto para shell no início

3

Usando perfis, você pode enviar texto para o shell no início de uma sessão, em "enviar texto no início". Eu gostaria de fazer isso três vezes seguidas, mas parece que há apenas uma string permitida. Alguém sabe de outra maneira de fazer isso usando iterm2? Acredito que posso usar o AppleScript, mas prefiro iniciar uma sessão usando o iterm2 diretamente.

Ex:

<terminal session starts>
ssh server
send "asdf"
send "qwer"
send "zxcv"
(done...)

A razão pela qual não posso simplesmente definir um perfil para fazer isso é que meu trabalho tem um ambiente especial que geralmente faz três perguntas. Quero automatizar a resposta a essas 3 perguntas e defini-las na configuração do perfil iterm2 em "enviar texto no início".

barrrista
fonte

Respostas:

4

Existe uma ferramenta chamada Expectque faz handshake e comunicação generalizada que você pode usar; no entanto, o iTerm2 pode fazer parte do que o Expect faz diretamente da guia Avançado.

Nota: O Expect está escrito em TcL, uma linguagem incrível para se conhecer por si só. Essa pergunta em particular provavelmente está explicada com uma resposta bem comentada em um Expect FAQ em algum lugar. Além disso, se você optar por implementar uma solução com o Expect over iTerm2, poderá usá-la em mais do que seu host OSX. Então pense sobre esse comércio logo de cara. No curto prazo, a opção Triggers do iTerm2 fará o truque para você.

Portanto, para fornecer parte do que o Expect fornece diretamente do iTerm2, vá para a guia Avançado. Lá você encontrará o recurso Triggers. A partir daí, você pode adicionar "+" uma regra de acionamento específica. Em poucas palavras, o que esses gatilhos (e o Expect) permitem fazer é filtrar todo o texto de e para o Terminal, fazer a correspondência desse texto com o gatilho de expressões regulares (ReEx) especificado pelo usuário e quando esse ReEx é correspondido no fluxo de texto do Terminal , o iTerm2 executará uma tarefa especificada pelo usuário.

Aqui está uma regra de acionador que corresponderá a uma linha que contém exatamente uma palavra, Senha e, em seguida, Enviar texto: Minha senha.

insira a descrição da imagem aqui

Lembre-se de que o fluxo de texto do terminal contém caracteres invisíveis e especificar o ReEx exato para corresponder pode ser um desafio, especialmente, por exemplo, porque servidores diferentes implementam separadores de linha diferentes e, se um ReEx usa especificamente um, não pode corresponder a nenhuma razão aparente.

Uma coisa: estou pensando em por que você pode estar fazendo essa pergunta? Não sabe ao certo o que você está familiarizado, mas se quiser fazer o login automático via ssh, adicione um comentário e configurar isso é fácil. Se você investiu nisso, pesquise as palavras-chave "ssh-keygen" e "gere chaves públicas rsa para ssh".

Sei que isso é um comentário, mas pensei em lançar isso já que já tenho espaço - pelo que vale a pena:

Eu acho que alguém usaria o Send text at start:para definir variáveis ​​de ambiente que são relevantes para a sessão do host remoto. Por exemplo, usei esse método para passar parâmetros para meus processos remotos como um meio de passar parâmetros por variáveis ​​de ambiente. Não tenho certeza, mas isso seria um uso desse Commandcampo para personalizar o que acontece quando um determinado ssh userid@hostnameitem é executado.

Veja a segunda resposta em É possível obter o SSH para encaminhar argumentos vazios? para o exemplo completo, mas tudo se resume à seguinte sintaxe:

$ ssh me@localhost 'VAR1="var1 text" /tmp/try.pl'

Minha hipótese é que um uso potencial da Send text at start:opção é fornecer o ambiente do processo VAR1="var1 text" /tmp/try.pl, ou simplesmente o VAR="var1 text"ambiente remoto.

Aqui está um exemplo mais concreto do zero, usando um host Mac Dual-G5 chamado r2d2:

Veja como eu configuro o perfil do r2d2:

insira a descrição da imagem aqui

Agora, quando eu chuto um r2d2 iTerm2, e echo $FREDvejo que qualquer comando que eu teria chamado à la, o ssh poderia examinar o ambiente e determinar um contexto para execução:

insira a descrição da imagem aqui

Claro, isso é especulação, considerando o que eu experimentei, então é apenas uma possibilidade. Agora eu sei que poderei explorar esse caminho de controle, então obrigado pela pergunta.

Billy McCloskey
fonte
0

Você também pode ter um script como ~/test.py

#!/usr/local/bin/python3

print("echo hello world")

E, em seguida, execute esse script como um co-processo no menu iTerm2 Sessão-> Executar Co-Processo e especificando o script como ~/test.py

Eu acho que é necessário torná-lo executável (embora eu não tenha tentado o contrário) chmod +x ~/test.py,.

Feliz codificação!

arod
fonte