Как перенаправить вывод telnet в файл

Обновлено: 07.07.2024

Всё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов. Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают.

  • 0, STDIN — стандартный поток ввода
  • 1, STDOUT — стандартный поток вывода
  • 2, STDERR — стандартный поток ошибок

STDIN

STDIN — это стандартный поток ввода оболочки. Для терминала стандартный ввод — это клавиатура. Когда используется символ перенаправления ввода — < , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Многие команды bash принимают ввод из STDIN , если в командной строке не указан файл, из которого надо брать данные. Например, это справедливо для команды cat .

Когда вы вводите команду cat в командной строке, не задавая параметров, она принимает ввод из STDIN . После того, как вы вводите очередную строку, cat просто выводит её на экран. И останавливается после того как получает EOF . EOF вводится нажатием сочетания клавиш Ctrl+D.

STDOUT

Можно осуществить перенаправление вывода в файл с добавлением в конец с помощью >> . При этом информация, хранящаяся в файле не будет удалена, а вся новая информация будет добавлена в конец этого файла.

STDERR

Устаревшая форма записи:

Оболочка определяет порядок перенаправления потоков в командной строке слева направо, поэтому приведенный выше пример нельзя записать так:

В этом случае сначала вывод ошибок перенаправляется в стандартный вывод (на экран), а потом стандартный вывод перенаправляется в файл data-error.txt . То есть, ошибки будут выведены в консоль, а данные — в файл.

Для дозаписи в файл data-error.txt

Перенаправление вывода в скриптах

Существует два метода перенаправления вывода в сценариях командной строки:

  • Временное перенаправление, или перенаправление вывода одной строки
  • Постоянное перенаправление, или перенаправление всего вывода сценария

Временное перенаправление вывода

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

Запустим скрипт так, чтобы вывод STDERR попадал в файл:

Постоянное перенаправление вывода

Если в скрипте нужно перенаправлять много выводимых на экран данных, добавлять >&2 к каждому вызову echo неудобно. Вместо этого можно задать перенаправление вывода в определённый дескриптор на время выполнения скрипта, воспользовавшись командой exec :

После запуска сценария весь вывод будет перенаправлен в файл output.txt .

Команду exec можно использовать не только в начале скрипта, но и в других местах:

Перенаправление ввода в скриптах

Для перенаправления ввода можно воспользоваться тем же способом, который использовался для перенаправления вывода. Например, команда exec позволяет сделать источником данных для STDIN какой-нибудь файл:

Эта команда указывает оболочке на то, что источником вводимых данных должен стать файл data.txt , а не обычный STDIN . Посмотрим на перенаправление ввода в действии:

Подавление вывода

Тот же подход используется, если, например, надо очистить файл, не удаляя его:

У меня работает устройство посещаемости Linux OS . Я могу подключить это устройство через сеанс Telnet. В устройстве есть несколько файлов, которые я хотел бы загрузить и загрузить с новыми файлами. Как я могу это сделать? У меня очень низкие знания по ОС Linux. Не могли бы вы помочь!

введите описание изображения здесь

Сколько файлов вы хотите передать? Можете ли вы вставить куда-нибудь выходные данные busybox --help и, ls -l /bin и ls -l /usr/bin , пожалуйста. на самом деле я хочу изменить фон рабочего стола этого устройства, и хочу загрузить логотип нашей компании туда на устройство. Такие опции недоступны в меню устройства (я уже просил эту опцию у продавца). Поэтому я подключил его через сеанс telnet и обнаружил в устройстве desktop.jpg и другие файлы изображений. Теперь я хочу получить эти файлы в моей локальной системе. и после проверки того же я буду загружать мои желаемые изображения в устройстве. Таким образом, он будет обновлять изображение устройства в соответствии с моими желаемыми изображениями. Я хочу изменить хотя бы изображение рабочего стола, которое доступно в устройстве по адресу / mnt / mtdblock / image Если вы хотите добавить информацию в следующий раз, отредактируйте свой вопрос вместо добавления комментариев.

Это зависит от того, какие инструменты установлены на клиентском устройстве / поддерживаются ядром.

Возможные способы передачи файлов (неупорядоченные):

  • ssh / sftp
  • кодирование двоичных файлов в отображаемый формат с помощью base64 / uuencode, а затем копирование из / в окно терминала telnet.
  • через простое соединение TCP с netcat или socat или с bash и / dev / tcp
  • загрузка / загрузка с wget или curl с веб-сервера
  • FTP-сервер с командной строкой FTP-клиент
  • Samba или NFS Mount

Скопируйте desktop.jpg с устройства на компьютер с помощью метода netcat / nc:

На вашем компьютере временно отключите (или перенастройте, если возможно) любой брандмауэр и запустите

и на устройстве

где вам нужно заменить ABCD на IP-адрес вашего компьютера. Как только передача прошла успешно, процесс netcat на вашем компьютере должен автоматически остановиться. Если нет, то что-то не так, и вы можете остановить это с Ctrl+C

По другому направлению просто обменяюсь < и > с обеих сторон. Сделайте сначала резервную копию оригинала desktop.jpg ( cp desktop.jpg desktop_orig.jpg ).

Я попробовал утилиту WinSCP и попытался подключить устройство по протоколу ftp / sftp / scp. но это не связано. Я могу подключить устройство с помощью команды telnet и увидеть файлы, которые хочу получить, и снова загрузить их на устройство. Возможно, на вашем устройстве не запущен ssh или ftp сервер. Ну, я не знаю, что .. Есть ли другой способ получить / загрузить файлы с этого устройства? Вы также можете использовать sz для отправки файлов через терминал. Вам это понадобится с обеих сторон.

У меня нет ssh или ftp (или т. Д.) На устройстве.

Итак, я делаю следующее:

  1. telnet a.b.c.d | tee telnet.log
  2. войдите и перейдите к файлу
  3. cat file.txt
  4. закрыть сеанс (закрываю панель tmux)
  5. очистить telnet.log от мусора

Должно быть легко написать утилиту для загрузки / выгрузки файла через telnet

Попробуй с rcp командой.

Используйте man rcp для получения дополнительной информации, если вы хотите автоматизировать переводы.

Кстати, вы знаете, это очень небезопасно , верно?

Я только что загрузил файл прошивки размером

7 Кбайт во встроенную систему Linux на базе BusyBox через последовательный порт.

Нет сетей, нет утилит для передачи файлов; Нет Base64 утилит или что-нибудь удаленно полезное на устройстве.

На хосте я тривиально зашифровал прошивку в следующий формат; своего рода шестнадцатеричный дамп, состоящий из литералов оболочки в сочетании с printf командами:

в основном printf команды оболочки с \x escape-последовательностями, которые printf интерпретируют. На устройстве я сделал:

затем использовал minicom файл ASCII для отправки ( Ctrl-A S ) для отправки этого файла на хост. Я мог бы просто использовать копирование и вставку, так как объем данных невелик.

Затем помечаем исполняемый файл и запускаем printf скрипт:

Проверено с помощью BusyBox, md5sum что firmware.bin контрольная сумма на устройстве соответствует исходному образу прошивки на хосте.

PS Синтаксис двойных кавычек оболочки проходит \x дословно, потому что это не распознанная escape-последовательность; следовательно, нам не нужно удваивать обратную косую черту.

@jofel и все остальные, большое спасибо за вашу помощь. Я думаю, что устройство имеет настроенную ОС, так как распознает только некоторые конкретные команды Linux. Netcat не распознается устройством. Однако сегодня мне удалось передать файл с помощью команды tftp. Я успешно заменил файл desktop.jpg этой командой. То, что я сделал, создал tftp сервер в оконной системе. Войдите в систему через telnet на устройстве и выполните следующие команды:

скачать файл tftp -l -p tftp -l desktop.jpg - 192.168.0.249 69

загрузить файл tftp -l desktop.jpg -g 192.168.0.249 69

Я сделал это сейчас с помощью этих методов:

Создайте ftp сервер (установив solerwinds) в оконной системе. Войдите в систему через telnet на устройстве и выполните следующие команды:

Одна из самых интересных и полезных тем для системных администраторов и новых пользователей, которые только начинают разбираться в работе с терминалом - это перенаправление потоков ввода вывода Linux. Эта особенность терминала позволяет перенаправлять вывод команд в файл, или содержимое файла на ввод команды, объединять команды вместе, и образовать конвейеры команд.

В этой статье мы рассмотрим как выполняется перенаправление потоков ввода вывода в Linux, какие операторы для этого используются, а также где все это можно применять.

Как работает перенаправление ввода вывода

Все команды, которые мы выполняем, возвращают нам три вида данных:

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

Перенаправление ввода / вывода позволяет заменить один из этих файлов на свой. Например, вы можете заставить программу читать данные из файла в файловой системе, а не клавиатуры, также можете выводить ошибки в файл, а не на экран и т д. Все это делается с помощью символов "<" и ">".

top -bn 5 > top.log


Опция -b заставляет программу работать в не интерактивном пакетном режиме, а n - повторяет операцию пять раз, чтобы получить информацию обо всех процессах. Теперь смотрим что получилось с помощью cat:


top -bn 5 >> top.log

По умолчанию для перенаправления используется дескриптор файла стандартного вывода. Но вы можете указать это явно. Эта команда даст тот же результат:

top -bn 5 1>top.log


ls -l /root/ 2> ls-error.log
$ cat ls-error.log


Чтобы добавить данные в конец файла используйте тот же символ:

ls -l /root/ 2>>ls-error.log


ls -l /root/ >ls-error.log 2>&1


Сначала будет отправлен вывод команды ls в файл ls-error.log c помощью первого символа перенаправления. Дальше в тот же самый файл будут направлены все ошибки. Второй метод проще:

ls -l /root/ &> ls-error.log

Также можно использовать добавление вместо перезаписи:

ls -l /root/ &>> ls-error.log

Стандартный ввод из файла

Большинство программ, кроме сервисов, получают данные для своей работы через стандартный ввод. По умолчанию стандартный ввод ожидает данных от клавиатуры. Но вы можете заставить программу читать данные из файла с помощью оператора "<":


sort <domains.list >sort.output


Таким образом, мы в одной команде перенаправляем ввод вывод linux.

Использование тоннелей

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

ls -lt | head -n 5

С помощью утилиты xargs вы можете комбинировать команды таким образом, чтобы стандартный ввод передавался в параметры. Например, скопируем один файл в несколько папок:

echo test/ tmp/ | xargs -n 1 cp -v testfile.sh


Здесь параметр -n 1 задает, что для одной команды нужно подставлять только один параметр, а опция -v в cp позволяет выводить подробную информацию о перемещениях. Еще одна, полезная в таких случаях команда - это tee. Она читает данные из стандартного ввода и записывает в стандартный вывод или файлы. Например:

echo "Тест работы tee" | tee file1


В сочетании с другими командами все это может использоваться для создания сложных инструкций из нескольких команд.

Выводы

Всё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов. Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают.

  • 0, STDIN — стандартный поток ввода
  • 1, STDOUT — стандартный поток вывода
  • 2, STDERR — стандартный поток ошибок

STDIN

STDIN — это стандартный поток ввода оболочки. Для терминала стандартный ввод — это клавиатура. Когда используется символ перенаправления ввода — < , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Многие команды bash принимают ввод из STDIN , если в командной строке не указан файл, из которого надо брать данные. Например, это справедливо для команды cat .

Когда вы вводите команду cat в командной строке, не задавая параметров, она принимает ввод из STDIN . После того, как вы вводите очередную строку, cat просто выводит её на экран. И останавливается после того как получает EOF . EOF вводится нажатием сочетания клавиш Ctrl+D.

STDOUT

Можно осуществить перенаправление вывода в файл с добавлением в конец с помощью >> . При этом информация, хранящаяся в файле не будет удалена, а вся новая информация будет добавлена в конец этого файла.

STDERR

Устаревшая форма записи:

Оболочка определяет порядок перенаправления потоков в командной строке слева направо, поэтому приведенный выше пример нельзя записать так:

В этом случае сначала вывод ошибок перенаправляется в стандартный вывод (на экран), а потом стандартный вывод перенаправляется в файл data-error.txt . То есть, ошибки будут выведены в консоль, а данные — в файл.

Для дозаписи в файл data-error.txt

Перенаправление вывода в скриптах

Существует два метода перенаправления вывода в сценариях командной строки:

  • Временное перенаправление, или перенаправление вывода одной строки
  • Постоянное перенаправление, или перенаправление всего вывода сценария

Временное перенаправление вывода

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

Запустим скрипт так, чтобы вывод STDERR попадал в файл:

Постоянное перенаправление вывода

Если в скрипте нужно перенаправлять много выводимых на экран данных, добавлять >&2 к каждому вызову echo неудобно. Вместо этого можно задать перенаправление вывода в определённый дескриптор на время выполнения скрипта, воспользовавшись командой exec :

После запуска сценария весь вывод будет перенаправлен в файл output.txt .

Команду exec можно использовать не только в начале скрипта, но и в других местах:

Перенаправление ввода в скриптах

Для перенаправления ввода можно воспользоваться тем же способом, который использовался для перенаправления вывода. Например, команда exec позволяет сделать источником данных для STDIN какой-нибудь файл:

Эта команда указывает оболочке на то, что источником вводимых данных должен стать файл data.txt , а не обычный STDIN . Посмотрим на перенаправление ввода в действии:

Подавление вывода

Тот же подход используется, если, например, надо очистить файл, не удаляя его:

Читайте также: