J'ai un système auquel je ne peux me connecter que sous mon nom d'utilisateur (myuser), mais je dois exécuter des commandes en tant qu'autre utilisateur (scriptuser). Jusqu'ici, je suis venu avec ce qui suit pour exécuter les commandes dont j'ai besoin:
ssh -tq myuser@hostname "sudo -u scriptuser bash -c \"ls -al\""
Si toutefois, lorsque j'essaie d'exécuter une commande plus complexe, telle que [[ -d "/tmp/Some directory" ]] && rm -rf "/tmp/Some directory"
j'ai rapidement des problèmes avec les citations. Je ne sais pas comment je pourrais passer cet exemple de commande complexe à bash -c
, alors que \"
les limites de la commande que je passe sont déjà délimitées (et que je ne sais donc pas comment citer / tmp / Some directory, qui inclut des espaces.
Existe-t-il une solution générale me permettant de passer n’importe quelle commande, quelle que soit la complexité / folie de la citation, ou s’agit-il d’une limite quelconque que j’ai atteinte? Existe-t-il d'autres solutions possibles et peut-être plus lisibles?
Réponses:
Une astuce que j’utilise parfois est d’utiliser base64 pour encoder les commandes et de la diriger vers bash sur l’autre site:
Ceci encodera le script, avec des virgules, des barres obliques inverses, des guillemets et des variables dans une chaîne sécurisée, et l'enverra à l'autre serveur. (
-w0
est nécessaire pour désactiver le retour à la ligne, ce qui se produit par défaut à la colonne 76). De l’autre côté,$(base64 -d)
décodera le script et le transmettra à bash pour qu’il soit exécuté.Je n’ai jamais eu de problème, peu importe la complexité du script. Résout le problème de l'évasion, car il n'est pas nécessaire d'échapper à rien. Il ne crée pas de fichier sur l'hôte distant et vous pouvez facilement exécuter des scripts extrêmement complexes.
la source
ssh user@remotehost "echo `base64 -w0 script.sh` | base64 -d | sudo bash"
base64 script | ssh remotehost 'base64 -d | sudo bash'
serait assez :)Voir l'
-tt
option? Lire lessh(1)
manuel.Une chose que je fais souvent est d’utiliser vim et le
:!cat % | ssh -tt somemachine
truc.la source
:!cat % | (command)
peut être fait comme:w !(command)
ou:!(command) < %
.ssh -tt
, mon ssh ne s'arrête pas après l'exécution de certaines commandes (l'ajoutexit
à la fin n'aide pas)Je pense que la solution la plus simple réside dans une modification du commentaire de @ thanasisk.
Créez un script,
scp
sur la machine, puis exécutez-le.Avoir le script
rm
lui-même au début. Le shell a ouvert le fichier, il a donc été chargé et peut ensuite être supprimé sans problèmes.En faisant les choses dans cet ordre (le
rm
premier, les autres ensuite), il sera même supprimé s'il échoue à un moment donné.la source
Vous pouvez utiliser le
%q
spécificateur de format avecprintf
pour prendre en charge la variable qui s’échappe pour vous:printf -v
écrit la sortie dans une variable (dans ce cas,$cmd_str
). Je pense que c'est la manière la plus simple de le faire. Il n'est pas nécessaire de transférer des fichiers ou d'encoder la chaîne de commande (autant que j'aime le truc).Voici un exemple plus complexe montrant que cela fonctionne aussi bien entre crochets et esperluettes:
Je ne l'ai pas testé avec
sudo
mais cela devrait être aussi simple que:Si vous le souhaitez, vous pouvez ignorer une étape et éviter de créer la variable intermédiaire:
Ou même simplement éviter de créer une variable entièrement:
la source
Voici la manière "correcte" (syntaxique) d'exécuter quelque chose comme ceci dans bash:
Pour une explication détaillée du fonctionnement de cette procédure, veuillez consulter https://stackoverflow.com/a/21761956/111948.
la source
Êtes-vous conscient que vous pouvez utiliser
sudo
pour vous donner un shell où vous pouvez exécuter des commandes en tant qu'utilisateur choisi?la source
Vous pouvez définir le script sur votre machine locale, puis le
cat
diriger vers la machine distante:la source
sudo -u scriptuser
? Hérédoc serait-il utilisable étant donné que je devais avoir des variables dans le script, je serais en train de me diriger vers la machine?echo "sudo `cat fileForSsh.txt`" | ssh ...
mais je continue à obtenirsudo: sorry, you must have a tty to run sudo
./etc/sudoers
fichier modifiéssh -tq user@host "sudo bash -s" < test.sh
Simple et facile.
la source
Si vous utilisez un shell Bash suffisamment moderne, vous pouvez placer vos commandes dans une fonction et l’imprimer sous forme de chaîne
export -p -f function_name
. Le résultat de cette chaîne peut alors contenir des commandes arbitraires qui ne doivent pas nécessairement être exécutées en tant que root.Un exemple utilisant les tuyaux de ma réponse sur Unix.SE :
Un exemple qui récupère enregistre le fichier pour l'utilisateur connecté et installe un programme racine:
Si vous souhaitez exécuter toute la commande en utilisant
sudo
, vous pouvez utiliser ceci:la source
Voici ma solution (pas vraiment testée) pourrie:
Non vous pouvez faire:
La prochaine étape consiste à créer un
betterssh
script qui effectue déjà ceci:la source
Pour ceux qui ont besoin de passer des paramètres au script, cela devrait être comme suit:
la source
Commencez par créer un script local, puis exécutez-le à distance à l'aide de la commande suivante:
la source