2016-08-21 3 views
0

Je souhaite écrire du texte de stdin dans un fichier appartenant à root. Je le fais par programme à travers une connexion SSH - essentiellement à partir d'un script - donc l'utilisation d'un éditeur de texte est hors de question. Il n'y a pas de terminal. Le processus est entièrement automatisé.Comment utiliser la redirection de sortie avec sudo?

Étant donné que [a] l'élévation de la racine peut être obtenue par sudo, et [b] Les fichiers peuvent être écrites à l'aide cat avec redirection, je supposais les éléments suivants travaillerais:

ssh [email protected] sudo cat >the-file 

Malheureusement, la redirection est appliqué à sudo, et non à cat. Comment puis-je appliquer la redirection à cat dans cet exemple?

+0

En fait, vous pouvez utiliser un éditeur de texte même sur une connexion SSH, les éditeurs comme vim ou nano devrait fonctionner correctement. Essayez d'expliquer mieux votre cas avec la connexion SSH. Vous êtes déjà connecté lorsque vous essayez de rediriger? – paulequilibrio

+0

Votre commande sudo ne semble pas correcte. Il devrait être 'sudo -u utilisateur -h host cat> le-fichier'. Cela fonctionne sur mon système. "Je le fais à travers une connexion SSH, donc utiliser un éditeur de texte est hors de question". Cette conclusion n'est pas aussi évidente que vous le faites. Les éditeurs tels que 'vim',' nano' et même 'emacs -nw' fonctionnent très bien dans un terminal. – kaylum

+0

@ John1024 oui, je pourrais utiliser tee, mais je préfère résoudre le problème de redirection directement. –

Répondre

2

Le modèle normal pour ce faire est la suivante:

ssh [email protected] 'cat | sudo tee the-file' 

tee redirige vers un fichier et peut être exécuté avec sudo. Si vous souhaitez imiter >> où le fichier est ajouté, utilisez sudo tee -a.

Vous devrez également être sûr de citer votre commande comme ci-dessus, afin que le tube ne soit pas interprété par le shell local.

Modifier

La commande teeis part of POSIX, de sorte que vous pouvez compter sur l'existant.

Pour rediriger erreur aussi bien:

ssh [email protected] 'some_command 2>&1 | sudo tee output-file' 
+0

Donc la redirection * ne peut pas être utilisée dans une commande 'sudo'? Par exemple, si "tee" (et je suppose que "dd") n'existait pas sur le système, je serais désossé? Ou si je voulais rediriger aussi stderr, je serais désossé alors aussi? –

+0

Voir mon edit :) Ouais, je veux dire, vous pouvez probablement utiliser 'ssh 'sudo sh -c" cat> le-fichier "'', mais vous aurez rapidement entrer dans "deux niveaux de nombreux niveaux de devis" et je Je ne sais pas si la redirection fonctionnera correctement avec 'sh -c' sur ssh :) – Will

+1

Vous pouvez utiliser la redirection avec n'importe quelle commande, mais la redirection a lieu avant que la commande s'exécute. (En fait, votre question est fausse, la redirection s'applique à toute la ligne de commande 'ssh', pas' sudo'.) Vous pouvez donc quelque chose comme 'sudo sh -c 'cat> output-file'' pour obtenir la redirection privilégiée , mais 'sudo tee' est beaucoup plus simple. Avec 'sudo', vous devriez toujours vous efforcer de restreindre l'opération privilégiée à la commande la plus simple possible. – tripleee