Вопрос или проблема
Я могу скопировать файл на удаленную машину 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. Наиболее распространенными способами являются:
-
Использование команды
echo
через SSH: Можно передать текст с помощью командыecho
и перенаправить его в файл на удаленном сервере. -
Использование команд
cat
иdd
: Это позволяет более гибко манипулировать файлами на удаленной системе, особенно если требуется добавление данных в уже существующий файл. -
Редактирование файлов с помощью SSH и текстовых редакторов: Подключившись к удаленному серверу через SSH, можно напрямую использовать текстовые редакторы, такие как
vi
,nano
илиpico
. Однако данный способ не автоматизирует процесс записи файлов. -
Использование программных средств автоматизации, таких как
sshpass
: Это может быть полезно при автоматизации задач, если нужно войти на удаленный сервер без ввода пароля вручную.
Примеры
-
Команда
echo
через SSH:ssh user@remotehost "echo 'Some Text' > /remotefile.txt"
Данный подход прост и эффективен для записи небольших данных. Однако он заменит все содержимое файла новым текстом.
-
Использование команды
cat
для добавления:echo 'Some Text' | ssh user@remotehost "cat >> /remotefile.txt"
Здесь данные не перезаписывают файл, а добавляются в его конец, что особенно полезно при создании логов или сохранении истории изменений.
-
Использование
dd
для более сложной манипуляции файлами:echo 'Some Text' | ssh user@remotehost 'dd of=/remotefile.txt oflag=append conv=notrunc'
Хотя такой подход может показаться более сложным, он полезен, если стандартное перенаправление не подходит из-за системных ограничений.
-
Автоматизация с помощью
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 и понимание его возможностей позволит вам эффективно управлять удаленными файлами и автоматизировать множество задач в вашей ИТ-инфраструктуре.