SSH rend tous les mots de passe saisis visibles lorsque la commande est fournie en tant qu'argument de la commande SSH

45

Si je lance ceci:

ssh user@server 'mysql -u user -p'

Quand il me demande le mot de passe MySQL et que je commence à taper, le mot de passe est visible à l'écran. Comment puis-je empêcher cela? Si je me connecte via sshpuis exécute la commande MySQL, tout fonctionne correctement.

utilisateur110971
la source
5
Ne pensez-vous pas que ce titre est plutôt flou? Vous pourriez dire que cela rend tout le texte, y compris les mots de passe, visible. Et comment ssh veut-il savoir ce que vous tapez est un mot de passe par rapport à une autre commande ou donnée?
barlop
@barlop Je suis ouvert aux suggestions.
user110971
@barlop fonctionne bien lorsque vous exécutez la commande une fois que vous avez ssh sur le serveur. Je cherche un moyen de rendre le comportement ssh identique lorsque les commandes sont fournies en tant qu'argument.
user110971
ce n'est probablement pas nécessaire, mais pouvez-vous inclure un exemple copié / collé complet à partir de la console, par exemple, en montrant non seulement la commande ssh, mais également la réponse et l'invite mysql qui suit. Vous pouvez changer le mot de passe en swisscheese pour ne pas le mettre sur le site, je ne peux pas le tester pour le moment
barlop
@barlop Ce sont exactement les mêmes messages que vous attendez, à savoir mot de passe ssh suivi d'invites de mot de passe MySQL
utilisateur110971

Réponses:

100

Si vous fournissez une commande à distance à exécuter, SSH n'alloue pas de tty. Par conséquent, la commande à distance ne peut pas désactiver l'écho. Vous pouvez forcer SSH à fournir un terminal en utilisant l' -toption suivante:

ssh -t user@server 'mysql -u user -p'

L'option équivalente (pour -oou pour le fichier de configuration) est RequestTTY. Je vous déconseille de l'utiliser dans config car cela peut avoir des effets indésirables sur les commandes non interactives .

Toby Speight
la source
15
Ou vous pouvez modifier ~ / .ssh / config pour configurer cet hôte spécifique de manière à toujours demander un TTY. Voir RequestTTYdans man 5 ssh_config.
un CVn
7
@ MichaelKjörling (et Toby): ajoutez peut-être un avertissement indiquant que l'ajout de "-t" doit être réservé à un usage interactif, car il a des effets secondaires. Pour une bonne vue sur certains de ces effets secondaires: unix.stackexchange.com/a/122624/27616 (from StephaneChazelas)
Olivier Dulac
D'accord - J'allais suggérer qu'il est dommage que vous ne puissiez pas ajouter de paramètres (comme celui-ci) en fonction de la commande à distance (plutôt que par l'hôte).
Toby Speight
28

Stocker le mot de passe dans un fichier d'options protégé

Si vous pouvez faire confiance à [*] la sécurité de l'ordinateur distant, vous pouvez stocker le mot de passe dans un fichier d'options correctement protégé, comme suggéré dans le chapitre Conseils pour la sécurité des mots de passe du manuel du manuel, sans qu'il soit nécessaire de communiquer via sshou de taper chaque temps.

Plus précisément, vous pouvez ajouter une ligne dans la section [client] du fichier .my.cnfde votre répertoire personnel:

[client]
password=your_pass

Bien sûr, vous devez empêcher ce fichier d’être accessible à qui que ce soit en définissant le mode d’accès au fichier sur 400 ou 600 avec, par exemple:

chmod 600 ~/.my.cnf

Ensuite, vous pouvez utiliser quelque chose comme

ssh user@server 'mysql -u user110971 --defaults-file=/home/user110971/mysql-opts'

user110971est le nom d'utilisateur de votre compte.


Forcer le SSH à allouer un pseudo tty ( ssh -t)

Ce problème se produit chaque fois que vous envoyez une commande sshet que vous devez insérer une entrée car, par défaut, sshaucun pseudo-tty ne sera alloué.

Vous pouvez forcer l'allocation de tty avec l'option -t(voire plusieurs si nécessaire):

-t

Forcer l'allocation de pseudo-tty. Ceci peut être utilisé pour exécuter des programmes d'écran arbitraires sur une machine distante, ce qui peut s'avérer très utile, par exemple lors de la mise en œuvre de services de menu. Plusieurs -toptions forcent l'allocation de tty, même si ssh n'a pas de tty local.

Comme vous pouvez le lire dans ce poste Debian (Jul_11_2008) au sujet sudo, il est un vieux problème qui aime se reproduisent:

ssh user@server "sudo ls"  
password: password  

Et le mot de passe vous est montré

La solution consiste à forcer ssh à allouer un pseudo-tty, avec l'indicateur -t:

ssh -t user@server sudo ls

Remarque:

[*] Si vous pouvez compter sur le mot de passe dans un fichier accessible uniquement par vous et racine sur leclient actif .
S'il est possible de redémarrer l'ordinateur distant en changeant de système d'exploitation ou de retirer le disque dur, l'ordinateur ne peut pas être considéré comme totalement sécurisé ... mais dans ce cas, la base de données elle-même ne sera pas sécurisée.

Hastur
la source
1
peut-être ajouter un peu d’avertissement que l’ajout de "-t" devrait être réservé à un usage interactif, car il a des effets secondaires. Pour une bonne vue sur certains de ces effets secondaires: unix.stackexchange.com/a/122624/27616 (from StephaneChazelas)
Olivier Dulac
3

L'option de montage "hidepid" pour proc fs est également utile. Cela rend vos lignes de commande invisibles dans la liste des processus pour les autres utilisateurs. exemple de fstab:

proc /proc proc hidepid=1 0 0
bandie
la source