Cómo escribir remotamente en un archivo usando SSH

41

Puedo copiar un archivo a una máquina remota de Linux sin ningún problema con

scp file user@host: /pathtowrite_file

Sin embargo, tengo dificultades para escribir en un archivo de una máquina Linux a otra. Esto es lo que intenté:

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

El aviso que recibo es

stdin: no es un tty

En cualquier caso, el archivo en la máquina remota no refleja el texto enviado 'Algún texto'.

suffa
fuente

Respuestas:

70

Puede usar el comando "cat" para crear el archivo remoto.

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

Los -Tdesactiva pseudo-terminal de la asignación y hace que deje de hacer llegar el mensaje,

El pseudo-terminal no se asignará porque stdin no es un terminal.

Aragorn
fuente
pero quiero escribir en el archivo existente en la máquina remota.
suffa
2
"cat> /remotefile.txt" se ejecuta en la máquina remota y si desea agregar un archivo existente, reemplace ">" por ">>"
Aragorn
@suffa: ¿Está intentando agregar a un archivo existente? ¿O desea sobrescribir el archivo pero falla si aún no existe? ¿O que?
David Schwartz
@ David Schwartz, tampoco. Me gustaría sobrescribir, y fallar si no sale ... pero, tomaría solo agregar en este punto.
suffa
`echo 'Some Text' | ssh user @ remotehost" tee -a /remotefile.txt "` también funcionó para mí.
Simplemente Seth
10

Un poco más corto que la otra respuesta:

ssh user@remotehost "echo Some Text > /remotefile.txt"
g33kz0r
fuente
3
Cierto; esto funcionará, si escribir una sola línea de texto en el archivo remoto es realmente todo lo que el OP quiere hacer. El comando en la pregunta parece una prueba de prueba de concepto. La pregunta dice: "escribir en un archivo de una máquina Linux a otra". Si el usuario quiere ejecutar un comando arbitrario (o secuencia de comandos), y no solo un echo, localmente, entonces su respuesta no ayuda, y la respuesta aceptada es la forma de hacerlo.
Scott
@Scott Múltiples comandos también son posibles utilizando este enfoque. Como la mayoría de las cosas Linux, TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r
Genial, gracias por el voto negativo. ¿Supongo que es más fácil que abordar mi punto? PD: tu comentario anterior no tiene sentido.
g33kz0r
1
OK, ¿ quieres más críticas? (1) ¿Por qué estás diciendo en el mundo ssh localhost? Eso solo enturbia el agua, no lo hace más claro. (2) Al no mostrar la redirección en su ejemplo modificado, plantea la cuestión de si sabe cómo agrupar comandos y enviar toda la salida a un archivo. … (Continúa)
Scott
1
(Continúa) ... (3) Has perdido mi punto al enfocarte en la frase "una sola línea de texto". Mi punto era que el OP podría querer hacer algo más sofisticado que escribir texto conocido en el archivo remoto: podría querer ejecutar un comando local y enviar la salida al archivo remoto, como en . Si puede adaptar su respuesta para abordar ese caso general, hágalo. command (localhost) > file (remotehost)
Scott
6

También es posible usar dd para agregar a un archivo. Quizás un poco oscuro pero útil si la redirección de salida en el host remoto no es posible.

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

Este ejemplo agrega su clave pública al archivo autorizado_claves en el host remoto.

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

sdl
fuente
3

Esto tomará el contenido de su portapapeles en una Mac y lo agregará al final de un archivo de forma remota:

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

Esto le permite escribir (agregar) al final de un archivo en un host remoto:

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

Si tiene que usarse varias veces, podría ser más fácil usar este código. Con la herramienta "sshpass", ssh no le pedirá una contraseña para cada invocación del script. (a menos que necesite mantenerlo en secreto, mejor no lo use)

Para obtener más información sobre 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
fuente
¿Más intuitivo que qué? Esto es esencialmente lo mismo que la respuesta de g33kz0r (de hace casi dos años), más algunas campanas y silbatos que no son particularmente claros. Al menos explique las cosas que ha agregado.
Scott, el
Si su secuencia de comandos se invoca con demasiados argumentos, emite un mensaje de error que dice que hay muy pocos argumentos.
G-Man dice 'reinstalar a Monica' el
Sí, es casi lo mismo que tienes razón. Lo único que agrega es que es un poco más fácil de usar (si es necesario varias veces). Y sí, el mensaje de error no es bueno, lo arreglaré.
sergeyrar 01 de
1

Simplemente puede usar vio nanoo picoeditor:

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

Sin embargo, tendrá que escribir Some Texten el editor usted mismo, por lo que este proceso no es realmente compatible con lotes.

Riptide9.7
fuente
-1

Cree una secuencia de comandos de la siguiente manera:

# !/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
fuente
Veo el voto negativo, muy probablemente de alguien que no usará un nuevo comando como yumsin una muy buena razón. Esta respuesta muestra cómo pero no por qué. (Cancelando el voto negativo por el momento, espero que edite esto para proporcionar más contexto)
SDsolar