De temps en temps je ferai quelque chose comme
ssh [email protected] sudo thing
et on me rappelle que ssh n'alloue pas de pseudo-tty par défaut. Pourquoi pas Quels avantages serais - je perdre si j'Aliased ssh
à ssh -t
?
De temps en temps je ferai quelque chose comme
ssh [email protected] sudo thing
et on me rappelle que ssh n'alloue pas de pseudo-tty par défaut. Pourquoi pas Quels avantages serais - je perdre si j'Aliased ssh
à ssh -t
?
ssh -t
toujours est mauvais parce que certaines commandes peuvent se briser de manière étrange. Tandis que l'exécution d'une commande nécessitant un PTY sans aucun résultat génère un message d'erreur indiquant que vous avez besoin d'un terminal.Réponses:
La principale différence est le concept d' interactivité . Cela ressemble à l'exécution de commandes localement dans un script, par opposition à leur saisie par vous-même. C'est différent en ce sens qu'une commande à distance doit choisir une valeur par défaut et que la non-interactive est la plus sûre. (et généralement le plus honnête)
STDIN
Ctrl-c
pause provoquerait normalement la rupture immédiate d'une boucle de la commande ssh, vos séquences de contrôle seront plutôt envoyées au serveur distant. Cela entraîne la nécessité de "marteler" la frappe afin de s'assurer qu'elle arrive lorsque le contrôle quitte la commande ssh, mais avant le début de la commande ssh suivante.Je vous
ssh -t
déconseille d' utiliser des scripts non surveillés, tels que crons. Un shell non interactif demandant à une commande distante de se comporter de manière interactive pour une entrée est une source de problèmes.Vous pouvez également tester la présence d'un terminal dans vos propres scripts shell. Pour tester STDIN avec les nouvelles versions de bash:
STDOUT
ssh
surssh -t
, vous pouvez vous attendre à obtenir un retour chariot supplémentaire à la fin de votre ligne. Ce n'est peut-être pas visible pour vous, mais c'est là; il apparaîtra comme^M
lorsqu'il est connecté àcat -e
. Vous devez ensuite déployer tous les efforts supplémentaires pour vous assurer que ce code de contrôle n'est pas affecté à vos variables, en particulier si vous allez insérer cette sortie dans une base de données.Voici le même test bash que précédemment, mais pour STDOUT:
Bien qu'il soit possible de contourner ces problèmes, vous allez inévitablement oublier de concevoir des scripts autour de ces problèmes. Nous le faisons tous à un moment donné. Les membres de l' équipe peuvent également ne pas se rendre compte / se rappeler que cet alias est en place, qui à son tour créer des problèmes pour vous quand ils écrivent des scripts qui utilisent votre alias.
Le pseudonyme
ssh
dessh -t
est un cas où vous violerez le principe de conception de la moindre surprise . les gens rencontreront des problèmes auxquels ils ne s'attendent pas et peuvent ne pas comprendre ce qui les cause.la source
Caractères d'échappement SSH et transfert de fichiers binaires
Un autre avantage qui n’a pas été mentionné dans les autres réponses est que, lorsqu’ils fonctionnent sans pseudo-terminal , les caractères d’échappement SSH tels que ne
~C
sont pas pris en charge ; Cela permet aux programmes de transférer des fichiers binaires pouvant contenir ces séquences en toute sécurité.Preuve de concept
Copier un fichier binaire en utilisant un pseudo-terminal:
Copier un fichier binaire sans utiliser de pseudo-terminal:
Les deux fichiers ne sont pas identiques:
Celui qui a été copié avec un pseudo-terminal est corrompu:
tandis que l'autre n'est pas:
Transfert de fichiers sur SSH
Ceci est particulièrement important pour les programmes tels que
scp
oursync
utilisant SSH pour le transfert de données. Cette description détaillée du fonctionnement du protocole SCP explique en quoi celui-ci consiste en un mélange de messages de protocole textuels et de données de fichier binaires.OpenSSH vous aide à vous protéger de vous-même
Il est à noter que même si l'
-t
indicateur est utilisé, lessh
client OpenSSH refusera d'allouer un pseudo-terminal s'il détecte que sonstdin
flux n'est pas un terminal:Vous pouvez toujours forcer le client OpenSSH à allouer un pseudo-terminal avec
-tt
:Dans les deux cas, peu importe la raison (sensuellement)
stdout
oustderr
sont redirigés:la source
Sur l'hôte distant, nous devons faire avec ce paramètre:
Sans sudo
Et avec sudo
Avec sudo nous obtenons le retour supplémentaire
La solution consiste à désactiver la nouvelle ligne à traduire en chariot retour-nouvelle ligne avec
stty -onlcr
la source
Pensez à la compatibilité ascendante.
Les 2 modes principaux de ssh sont: login-interactive avec tty et commande-spécifiée sans tty, car c’étaient les capacités exactes de
rlogin
etrsh
respectivement. SSH devait fournir un sur-ensemble derlogin
/rsh
fonctionnalités pour réussir son remplacement.Donc, les valeurs par défaut ont été décidées avant la naissance de ssh. Des combinaisons telles que "Je veux spécifier une commande et obtenir un tty" devaient être accessibles avec de nouvelles options. Soyez heureux qu'au moins nous ayons cette option maintenant, contrairement à ce que nous utilisions
rsh
. Nous n'avons échangé aucune fonctionnalité utile pour obtenir des connexions cryptées. Nous avons des bonus!la source
De
man ssh
:Cela vous permet d’obtenir un "shell" sur le serveur distant. Pour les serveurs qui n'accordent pas d' accès shell mais autorisent SSH (Github est un exemple connu d'accès SFTP), l'utilisation de cet indicateur entraîne le rejet de votre connexion par le serveur.
Le shell contient également toutes vos variables d'environnement (comme
$PATH
), de sorte que l'exécution de scripts nécessite généralement l'utilisation d'un terminal.la source
non-interactive
,interactive
etlogin
.login
est une caractéristique supplémentaire des deux autres types de coque. Les permutations de ces trois fichiers déterminent quels fichiers sont générés lors de la connexion, ce qui influence à son tour la façon dont l'environnement sera initialisé. (variables, comme vous l'avez mentionné)