Как удаленно записать в файл, используя SSH

41

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

scp file user@host: /pathtowrite_file

Тем не менее, я испытываю трудности при записи в файл с одной машины Linux на другую. Вот что я пытался:

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

Уведомление, которое я получаю,

STDIN: это не TTY

В любом случае, файл на удаленном компьютере не отражает текст, отправленный «Some Text».

Suffa
источник

Ответы:

70

Вы можете использовать команду "cat" для создания удаленного файла.

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

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

Псевдо-терминал не будет выделен, потому что stdin не является терминалом.

Арагорн
источник
но я хочу записать в существующий файл на удаленной машине.
суффи
2
«cat> /remotefile.txt» запускается на удаленной машине, и если вы хотите добавить к существующему файлу, вы заменяете «>» на «>>»
Aragorn
@suffa: вы пытаетесь добавить к существующему файлу? Или вы хотите перезаписать файл, но потерпите неудачу, если он еще не существует? Или что?
Дэвид Шварц
@ Дэвид Шварц - тоже. Я хотел бы перезаписать и потерпеть неудачу, если он не завершится ... но я бы просто добавил на этом этапе.
суффи
`echo 'Some Text' | ssh user @ remotehost" tee -a /remotefile.txt "` работал и для меня.
Просто Сет
10

Немного короче другого ответа:

ssh user@remotehost "echo Some Text > /remotefile.txt"
g33kz0r
источник
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'

В этом примере ваш открытый ключ добавляется в файл author_keys на удаленном хосте.

(Источник: 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/automatics-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
источник
Более интуитивно, чем что? По сути, это то же самое, что и ответ 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в этом редакторе, так что этот процесс не является пакетно-совместимым.

Riptide9.7
источник
-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