Як віддалено записати у файл за допомогою SSH


41

Я можу скопіювати файл на віддалену машину Linux без проблем

scp file user@host: /pathtowrite_file

Однак у мене виникають труднощі із записом у файл з однієї машини Linux на іншу. Ось що я спробував:

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

Повідомлення, яке я отримую, - це

stdin: не tty

У будь-якому випадку файл на віддаленій машині не відображає текст, надісланий "Деяким текстом".

Відповіді:


70

Ви можете скористатися командою "cat" для створення віддаленого файлу.

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

В -Tвідключає псевдо-термінал розподілу і зупиняє вас від отримання повідомлення,

Псевдотермінал не буде виділено, оскільки stdin не є терміналом.


але, я хочу записати в існуючий файл на віддаленій машині.
suffa

2
"cat> /remotefile.txt" працює на віддаленій машині, і якщо ви хочете додати існуючий файл, ви заміните ">" на ">>"
Aragorn

@suffa: Ви намагаєтесь додати до наявного файлу? Або ви хочете перезаписати файл, але не вдалося, якщо він ще не існує? Або те, що?
Девід Шварц

@ Девід Шварц - будь-який. Я хотів би перезаписати, а не вийти з ладу, якщо він не вийде ... але я би взяв лише додавання в цьому пункті.
suffa

`echo 'Some Text' | ssh user @ remotehost" tee -a /remotefile.txt "` працював і для мене.
Просто Сет

10

Трохи коротше, ніж інша відповідь:

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

3
Правда; це спрацює - якщо запис одного рядка тексту у віддалений файл дійсно все, що хоче зробити ОП. Команда у питанні виглядає як тест на підтвердження концепції. Питання говорить: "запис у файл з однієї машини Linux на іншу". Якщо користувач хоче виконати довільну команду (або послідовність команд) - а не лише echoлокально, то ваша відповідь не допоможе, і прийнята відповідь - це спосіб це зробити.
Скотт

@Scott Кілька команд також можливі за допомогою цього підходу. Як і більшість речей Linux, TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r

Класний чувак, спасибі за протилежне. Я думаю, що це простіше, ніж насправді вирішувати мою думку? PS ваш коментар вище не має сенсу.
g33kz0r

1
Добре, ви хочете більше критики? (1) Чому в світі ви говорите ssh localhost? Це просто замулює воду, не робить її зрозумілішою. (2) Не показуючи перенаправлення у вашому модифікованому прикладі, ви ставите питання про те, чи знаєте ви як згрупувати команди та надіслати весь вихід в один файл. … (Продовження)
Скотт

1
(Продовження)… (3) Ви пропустили мою думку, зосередившись на фразі «єдиний рядок тексту». Моя думка полягала в тому, що ОП може захотіти зробити щось більш складне, ніж записувати відомий текст у віддалений файл - він, можливо, захоче запустити локальну команду і надіслати вихід у віддалений файл, як в . Якщо ви можете адаптувати свою відповідь, щоб вирішити цю загальну справу, будь ласка, зробіть це. command (localhost) > file (remotehost)
Скотт

6

Також можливо використовувати dd для додавання до файлу. Можливо, трохи незрозуміло, але корисно, якщо перенаправлення виводу на віддалений хост неможливе.

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

Цей приклад додає ваш відкритий ключ до файлу санкціонованих_ ключів на віддаленому хості.

(Джерело: http://www.rsync.net/resources/howto/ssh_keys.html )


3

Це займе вміст буфера обміну на Mac та додасть його до кінця файлу віддалено:

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

Це дозволяє записувати (додавати) в кінець файлу на віддалений хост:

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

1

Якщо доводиться використовувати кілька разів, можливо, простіше використовувати цей код. За допомогою інструменту "sshpass", ssh не запросить пароль для кожного виклику сценарію. (якщо вам не потрібно зберігати це в таємниці, тоді краще не використовувати його)

Для отримання додаткової інформації про 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

Більш інтуїтивно зрозумілий, ніж що? Це по суті те саме , що відповідь g33kz0r (майже два роки тому), а також деякі дзвіночки, які не особливо чіткі. Принаймні поясніть додані вами речі.
Скотт

Якщо ваш скрипт викликає занадто багато аргументів, він видає повідомлення про помилку, в якому йдеться про те, що аргументів занадто мало .
G-Man каже: "Відновіть Моніку"

Так, це майже те саме, що ти маєш рацію. Єдине, що він додає, це те, що він трохи простіший у використанні (якщо потрібно кілька разів). І так, повідомлення про помилку не годиться, я його виправлю.
sergeyrar

1

Ви можете просто використовувати viабо nanoчи picoредактор:

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

Однак вам доведеться записати Some Textйого в редактор самостійно, тому цей процес насправді не сумісний із пакетними.


-1

Створіть сценарій, як показано нижче:

# !/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

Я бачу знищення - швидше за все, від того, хто не використовуватиме нову команду, як, наприклад, yumбез дуже вагомих причин. Ця відповідь показує, як, але ні чому. (На даний момент відмінивши протокол - сподіваюся, ви відредагуєте це, щоб надати більше контексту)
SDsolar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.