Как удаленно записать данные в файл с помощью SSH

Вопрос или проблема

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

scp file user@host: /pathtowrite_file

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

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

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

stdin: is not a tty

В любом случае, файл на удаленной машине не отражает отправленный текст ‘Some Text’.

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

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

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

Pseudo-terminal will not be allocated because stdin is not a terminal.

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

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

Также можно использовать dd для добавления в файл. Возможно, это несколько неочевидно, но полезно, если перенаправление вывода на удалённом хосте невозможно.

cat ~/.ssh/id_rsa.pub | ssh [email protected] 'dd of=.ssh/authorized_keys oflag=append conv=notrunc'

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

(Источник: http://www.rsync.net/resources/howto/ssh_keys.html)

Это сподвинет содержимое вашего буфера обмена на Mac и добавит его в конец файла на удалённом сервере:

pbpaste | ssh [email protected] 'cat >> ~/.ssh/authorized_keys'

Это позволяет вам дописать в конец файла на удалённом сервере:

echo "Append string to file" | ssh [email protected] 'cat >> ~/.ssh/authorized_keys'

Я делаю это следующим образом, если это многострочный текст:

cat <<EOF | ssh genom@$IP -T "cat >>./remotefile.txt"
line one
line two
line three
EOF

или

( cat <<EOF 
line one
line two
line three
EOF
) | ssh genom@$IP -T "cat >>./remotefile.txt"

На моём ubuntu unix это работает и без опции T:

cat <<EOF | ssh genom@$IP "cat >>./remotefile.txt"
line one
line two
line three
EOF

Если нужно использовать несколько раз, возможно, проще использовать этот код. С помощью инструмента “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

Вы можете просто использовать редактор vi или nano или pico:

# Просто замените "vi" на "nano" или "pico", если хотите ими воспользоваться.
vi remotefile.txt

Однако вам придётся самостоятельно вписать Some Text в файл через редактор, поэтому этот процесс не совсем совместим для пакетной обработки.

Создайте скрипт следующим образом:

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

Ответ или решение

Для удаленной записи в файл с использованием SSH важно понимать, что протокол SSH предоставляет безопасный канал передачи данных между двумя узлами, и позволяет выполнять команды на удаленном сервере, как если бы вы работали непосредственно на этом сервере. В данном контексте ваша задача заключается в отправке текста из одного Linux-компьютера на другой и записи этого текста в указанный файл на удаленном сервере.

Теория

Эта задача может быть решена несколькими способами, используя возможности SSH. Наиболее распространенными способами являются:

  1. Использование команды echo через SSH: Можно передать текст с помощью команды echo и перенаправить его в файл на удаленном сервере.

  2. Использование команд cat и dd: Это позволяет более гибко манипулировать файлами на удаленной системе, особенно если требуется добавление данных в уже существующий файл.

  3. Редактирование файлов с помощью SSH и текстовых редакторов: Подключившись к удаленному серверу через SSH, можно напрямую использовать текстовые редакторы, такие как vi, nano или pico. Однако данный способ не автоматизирует процесс записи файлов.

  4. Использование программных средств автоматизации, таких как sshpass: Это может быть полезно при автоматизации задач, если нужно войти на удаленный сервер без ввода пароля вручную.

Примеры

  1. Команда echo через SSH:

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

    Данный подход прост и эффективен для записи небольших данных. Однако он заменит все содержимое файла новым текстом.

  2. Использование команды cat для добавления:

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

    Здесь данные не перезаписывают файл, а добавляются в его конец, что особенно полезно при создании логов или сохранении истории изменений.

  3. Использование dd для более сложной манипуляции файлами:

    echo 'Some Text' | ssh user@remotehost 'dd of=/remotefile.txt oflag=append conv=notrunc'

    Хотя такой подход может показаться более сложным, он полезен, если стандартное перенаправление не подходит из-за системных ограничений.

  4. Автоматизация с помощью sshpass:

    SCRIPT="echo 'Some Text' > /remotefile.txt"
    sshpass -p "password" ssh -o StrictHostKeyChecking=no user@remotehost "$SCRIPT"

    Это вариант для ситуаций, когда требуется частый доступ к удаленному серверу и выполнение стандартной операции записи.

Применение

Теперь, когда у вас есть понимание различных методов, важно выбрать подходящий способ в зависимости от вашей задачи:

  • Если вам нужно просто записать или создать файл с конкретной информацией, используйте методы с echo.
  • Для добавления данных к уже существующему содержимому файла более уместно применение команд cat и dd.
  • Если вы хотите разово отредактировать текст в удаленном файле, то подключившись через SSH, вы можете использовать текстовый редактор.
  • В случае необходимости автоматизированного выполнения, особенно в скриптах и системах CI/CD, используйте sshpass для упрощения доступа и выполнения операций.

Для обеспечения безопасности и простоты взаимодействия рекомендуется использовать аутентификацию с помощью SSH-ключей вместо паролей, что упростит процесс подключения и повысит безопасность. Общая стратегическая мысль заключается в том, чтобы выбрать подход, соответствующий вашим конкретным потребностям, учитывая объем данных, частоту проведения операции и условия безопасности.

В итоге, грамотное применение SSH и понимание его возможностей позволит вам эффективно управлять удаленными файлами и автоматизировать множество задач в вашей ИТ-инфраструктуре.

Оцените материал
Добавить комментарий

Капча загружается...