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
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"
:)
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.
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.
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:
- 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).
- Si le login est sur une heure de connexion TTY, enregistrements.
- Chèques/etc/nologin et/var/exécuté/nologin; Si l'on existe, il imprime le contenu et cesse (sauf la racine).
- Changements à exécuter avec des privilèges utilisateur normaux.
- Définit l'environnement de base.
- 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).
- Modifications apportées au répertoire de base de l'utilisateur.
- 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.
- Exécute la coque de l'utilisateur ou .
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).