Estou confuso sobre o que ssh -t
faz e por que às vezes preciso da -t
opção. Meu entendimento é que se eu executar ssh -t program
, o ssh é forçado a alocar um pseudo tty, com o qual ele passa a entrada do teclado para program
's e passa a program
saída de 's para stdout.
Mas parece que estou errado. Por exemplo, os dois seguintes parecem funcionar de forma idêntica, pois posso operar interativamente com rclone usando qualquer um deles, embora o primeiro comando o force a alocar um pseudo tty e o segundo comando o force a não alocar um pseudo tty:
ssh -t [email protected] rclone config
ssh -T [email protected] rclone config
Então o que ssh -t
realmente faz?
Atualizar:
Para esclarecer melhor essa questão, criei o seguinte script python chamado hello.py
.
import sys, signal
def signal_handler(sig, frame):
print('You pressed Ctrl+C!')
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
print(f"stdin is tty:{sys.stdin.isatty()}")
print(f"stdout is tty:{sys.stdout.isatty()}")
s = input("Enter what you want:")
print("Hello ", s)
Em uma máquina remota, se eu invocá-lo como , obtenho a seguinte saída:ssh -t [email protected] "python hello.py"
stdin is tty: true
stdout is tty: true
Enter what you want: cat
Hello cat
Se eu invocá-lo como , obtenho o seguinte:ssh -T [email protected] "python hello.py"
stdin is tty: false
stdout is tty: false
Enter what you want: cat
Hello cat
Em ambos os casos, consigo interagir com o programa digitando "cat" no teclado.
Uma diferença que observo é que quando pressiono CTRL-C, a -t
versão captura SIGINT, mas a -T
versão não.
Estou curioso para saber por que ainda consigo interagir com ele mesmo que stdin/stdout não seja um tty. Além disso, isatty()
é de fato uma função de biblioteca C padrão. O que um (pseudo) TTY realmente significa aqui?