web-dev-qa-db-fra.com

Ssh, exécutez une commande sur la connexion, puis restez connecté?

J'ai essayé cela avec attendre, mais cela n'a pas fonctionné: il a fermé la connexion à la fin.

Pouvons-nous exécuter un script via SSH qui se connectera à des machines distantes, exécutez une commande et ne se déconnecte pas?

SO SSH dans une machine, CD à tel et tel répertoire, puis exécutez une commande et restez connecté.

-Jonathan

(Attendez-vous à ce que j'ai utilisé)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact
30
jonathan

Ajouter un ; /bin/bash à la fin de votre ligne de commande sur le côté distant? C'est-à-dire:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"

Encore mieux, changez la racine .CASHRC pour être quelque chose comme ça:

Prompt_COMMAND="cd /tmp && ls -altr | tail ; unset Prompt_COMMAND"

:)

25
Bill Weiss

Le moyen probablement le plus simple et le plus propre de SSH dans un serveur, abonnez une coque interactive et des commandes d'exécution à l'intérieur de cette coque consiste à créer un fichier RC personnalisé pour Bash.

Dans votre fichier BASHRC personnalisé sur le serveur, tournez d'abord le fichier par défaut, puis ajoutez vos commandes personnalisées, par exemple.

~/.bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

Vous pouvez ensuite commencer votre session SSH comme celle-ci:

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"

Les -t L'option force une allocation pseudo-tty, de sorte que des choses comme des travaux d'achèvement de l'onglet.

Les --rcfile Option Spécifie quel rcfile à charger au lieu de la valeur par défaut. IMPORTANT: vous devez mettre "Double-Dash Arguments" sur la ligne de commande avant que les options à caractère unique afin d'être reconnues.

Les -i L'argument à/bin/bash est là pour invoquer une coque interactive.

4
Danilo Bargen

Si vous allez bien avec cela dans Python, PEXPECT a un exemple qui fait presque exactement ce que vous demandez:

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('[email protected]')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Pour ce faire avec SSH au lieu de FTP, vous voudriez que le code semblable à ce qui suit (les exemples de fichiers de PEXPECT ont beaucoup plus de détails et d'informations, mais voici les bases):

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('Prompt# ')
child.sendline ('cd /tmp')
child.expect ('Prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('Prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Ne me trompez pas, j'adore m'attendre (surtout autoext-être), mais python est juste tellement plus facile pour moi de grok.

4
Jed Daniels

Si quelqu'un veut des informations sur ce qui se passe à l'arrière-plan, vous devez consulter le manuel SSHD:

Lorsqu'un utilisateur se connecte avec succès, SSHD effectue ce qui suit:

  1. Si la connexion est sur un TTY, et aucune commande n'a été spécifiée, imprime la dernière heure de connexion et/etc/mod (sauf empêcher dans le fichier de configuration ou par ~/.hushlogin; voir la section Fichiers).
  2. Si le login est sur une heure de connexion TTY, enregistrements.
  3. Chèques/etc/nologin et/var/exécuté/nologin; Si l'on existe, il imprime le contenu et cesse (sauf la racine).
  4. Changements à exécuter avec des privilèges utilisateur normaux.
  5. Définit l'environnement de base.
  6. Lit le fichier ~/.ssh/environnement, s'il existe, et les utilisateurs sont autorisés à modifier leur environnement. Reportez-vous à l'option PerformUserVironment dans SSHD_CONFIG (5).
  7. Modifications apportées au répertoire de base de l'utilisateur.
  8. Si ~/.SSH/RC existe, le gère; else si/etc/ssh/sshrc existe, le gère; sinon court xauth (1). Les fichiers `` rc '' reçoivent le protocole d'authentification X11 et le cookie en entrée standard. Voir le CRSH ci-dessous.
  9. Exécute la coque de l'utilisateur ou .

https://www.freebsd.org/cgi/man.cgi?sshd (8) #login_process

1
Gerry

Vous devriez généralement éviter d'utiliser SSH de cette manière tel qu'il défait son objectif.
[.____] faire un

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

pour voir si votre clé est répertoriée dans le pool de session active SSH ou d'ajoutez-le vous-même (avec SSH-Add).

0
Kounavi