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


41

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

scp file user@host: /pathtowrite_file

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

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

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

STDIN: это не TTY

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

Ответы:


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"

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

Более интуитивно, чем что? По сути, это то же самое, что и ответ 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.