Processus en cours dans un TTY alloué par SSH ne se terminant pas une fois que stdin est consommé

1

Je peux effectuer un transfert de fichier via SSH * comme ceci:

ssh -T ${HOST} eval "cat > remote.txt" < local.txt

Cependant, si j'affecte un TTY à la place, il se bloque jusqu'à ce que j'appuie sur Ctrl + C:

ssh -tt ${HOST} eval "cat > remote.txt" < local.txt

Question: Pourquoi est-ce? Y at-il un travail autour?

Le mieux que je puisse comprendre, c'est que l'EOF local n'est pas propagé au processus distant.

Détails de la plateforme: OpenSSH_5.3p1, CentOS 6.7 x86_64


* Dans mon cas d'utilisation réel, je souhaite utiliser cette approche pour transférer des fichiers directement à un utilisateur sudo distant; Je ne peux pas utiliser SCP car je ne peux pas utiliser SSH en tant qu'utilisateur sudo. Le fichier sudoers de mon environnement cible a été requirettydéfini, d’où la nécessité d’un TTY.

Oliver Charlesworth
la source
pourquoi eval? Ce n'est pas nécessaire, n'est-ce pas?
Jakuje
@ Jakuje: echo "hello" | ssh -T ${HOST} "cat > foo.txt"mène à cat: >: No such file or directory. Et vous ne pouvez pas supprimer les guillemets, car cette redirection se fait localement!
Oliver Charlesworth
@Jakuje: Après une inspection plus poussée, cela semble être une différence entre les clients SSH (le problème ci-dessus est observé avec OpenSSH 6.2 sous OSX, mais pas 5.3 sous Linux).
Oliver Charlesworth
Est-ce que vous essayez sur le même serveur? Cela peut être un problème avec différents shells sur le serveur. Mais, oui, l’utilisation execgarantit que cela fonctionne presque partout. L'allocation de tty est un problème persistant depuis 2001, aussi appelé bogue n ° 52 dans openssh , toujours pas complètement résolu.
Jakuje
@ Jakuje - Il n'est pas évident de penser qu'il s'agit du même problème. La description ici implique que le processus enfant ( sleep) ne reçoit pas a SIGHUPau moment "correct"; dans mon cas, le catprocessus enfant ne se termine jamais, probablement parce que son stdin n'est jamais épuisé.
Oliver Charlesworth