Comment écrire à distance dans un fichier en utilisant SSH

41

Je peux copier un fichier sur une machine Linux distante sans problème avec

scp file user@host: /pathtowrite_file

Cependant, j'ai du mal à écrire dans un fichier d'une machine Linux à une autre. Voici ce que j'ai essayé:

echo 'Some Text' > /remotefile.txt | ssh user@remotehost

L'avis que je reçois est

stdin: n'est pas un tty

En tout état de cause, le fichier sur la machine distante ne reflète pas le texte envoyé «Some Text».

suffa
la source

Réponses:

70

Vous pouvez utiliser la commande "cat" pour créer le fichier distant.

echo 'Some Text' | ssh user@remotehost -T "cat > /remotefile.txt"

Les -Tdésactive l' allocation pseudo-terminal et vous empêche de faire passer le message,

Le pseudo-terminal ne sera pas attribué car stdin n'est pas un terminal.

Aragorn
la source
mais, je veux écrire dans le fichier existant sur la machine distante.
Suffa
2
le fichier "cat> /remotefile.txt" s'exécute sur la machine distante et si vous souhaitez ajouter un fichier existant, vous remplacez ">" par ">>"
Aragorn
@suffa: essayez-vous d'ajouter à un fichier existant? Ou voulez-vous écraser le fichier mais échouer s'il n'existe pas déjà? Ou quoi?
David Schwartz
@ David Schwartz - soit. Je voudrais écraser, et échouer si ça ne se termine pas ... mais, je prendrais juste d'ajouter à ce stade.
Suffa
`echo 'Some Text' | utilisateur ssh @ remotehost" tee -a /remotefile.txt "` a également fonctionné pour moi.
Simplement Seth
10

Un peu plus court que l'autre réponse:

ssh user@remotehost "echo Some Text > /remotefile.txt"
g33kz0r
la source
3
Vrai; cela fonctionnera - si l’opérateur veut vraiment écrire une seule ligne de texte dans le fichier distant. La commande dans la question ressemble à un test de validation. La question dit "écrire dans un fichier d'une machine Linux à une autre". Si l'utilisateur souhaite exécuter une commande (ou une séquence de commandes) arbitraire - et pas seulement une echo- localement, votre réponse ne vous aidera pas, et la réponse acceptée est le moyen de le faire.
Scott
@Scott Plusieurs commandes sont également possibles avec cette approche. Comme la plupart des choses Linux, TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r
Cool mec, merci pour le vote négatif. Je suppose que c'est plus facile que de vraiment aborder mon point? PS votre commentaire ci-dessus n'a aucun sens.
g33kz0r
1
OK, vous voulez plus de critiques? (1) Pourquoi dans le monde dites-vous ssh localhost? Cela ne fait que brouiller l’eau sans la rendre plus claire. (2) En n'indiquant pas la redirection dans votre exemple modifié, vous posez la question de savoir si vous savez comment grouper des commandes et envoyer toute la sortie dans un fichier. … (Suite)
Scott
1
(Suite)… (3) Vous avez manqué mon propos en vous concentrant sur l'expression «une seule ligne de texte». Mon point de vue était que l'OP pourrait vouloir faire quelque chose de plus sophistiqué que d'écrire du texte connu dans le fichier distant - il pourrait vouloir exécuter une commande locale et envoyer la sortie au fichier distant, comme dans . Si vous pouvez adapter votre réponse à ce cas général, veuillez le faire. command (localhost) > file (remotehost)
Scott
6

Il est également possible d'utiliser dd pour ajouter un fichier. Peut-être un peu obscure mais utile si la redirection de sortie sur l'hôte distant n'est pas possible.

cat ~/.ssh/id_rsa.pub | ssh user@remote.host 'dd of=.ssh/authorized_keys oflag=append conv=notrunc'

Cet exemple ajoute votre clé publique au fichier allowed_keys sur l'hôte distant.

(Source: http://www.rsync.net/resources/howto/ssh_keys.html )

sdl
la source
3

Cela prendra le contenu de votre presse-papiers sur un Mac et l'ajoutera à la fin d'un fichier à distance:

pbpaste | ssh root@my.machine.remote 'cat >> ~/.ssh/authorized_keys'

Cela vous permet d’écrire (ajouter) à la fin d’un fichier sur un hôte distant:

echo "Append string to file" | ssh root@my.machine.remote 'cat >> ~/.ssh/authorized_keys'
David
la source
1

Si doit être utilisé plusieurs fois, il pourrait être plus facile d'utiliser ce code. Avec l'outil "sshpass", ssh ne vous demandera pas de mot de passe pour chaque invocation du script. (sauf si vous avez besoin de le garder secret, mieux vaut ne pas l'utiliser)

Pour plus d'informations sur sshpass: https://stackoverflow.com/questions/12202587/automatically-enter-ssh-password-with-script

#!/bin/bash

SCRIPT="echo 'nameserver 8.8.8.8' > /etc/resolv.conf"        

if [ "$#" -ne 1 ]; then
        echo "Wrong number of arguments. usage: prog dest_machine"
else
        sshpass -p "root" ssh -o StrictHostKeyChecking=no root@"$1" "${SCRIPT}"
fi
sergeyrar
la source
Plus intuitif que quoi? C’est essentiellement la même chose que la réponse de g33kz0r (il ya presque deux ans), plus quelques cloches et sifflets qui ne sont pas particulièrement clairs. Au moins, expliquez ce que vous avez ajouté.
Scott
Si votre script est appelé avec trop d'arguments, un message d'erreur indiquant qu'il y a trop peu d' arguments est émis .
G-Man dit 'Réintégrez Monica'
Oui c'est presque pareil tu as raison. La seule chose qu'il ajoute, c'est qu'il est un peu plus facile à utiliser (si nécessaire plusieurs fois). Et oui le message d'erreur n'est pas bon, je vais le réparer.
sergeyrar
1

Vous pouvez simplement utiliser viou nanoou picoéditeur:

# Just replace "vi" with "nano" or "pico" if you want to use them.
vi remotefile.txt

Cependant, vous devrez ensuite écrire Some Textvous-même dans l'éditeur, de sorte que ce processus n'est pas vraiment compatible par lots.

Riptide9.7
la source
-1

Créez un script comme ci-dessous:

# !/bin/bash

read -p "Enter target server IP : " server
echo "Enter root password for $server : " ; read -s password

yum install sshpass -y

sshpass -p "$password" ssh -o strictHostKeyChecking=no root@$server echo "your text goes here" >> /remotefile.txt
Abhilash Mishra
la source
Je vois le vote négatif - probablement de la part de quelqu'un qui n'utilisera pas une nouvelle commande yumsans une très bonne raison. Cette réponse montre comment mais pas pourquoi. (Annulation de la réduction du vote pour le moment - j'espère que vous modifierez cela pour fournir plus de contexte)
SDsolar