Как отправить буквальную строку по TCP (netcat/socat-like), но с аргументами команды?

Обновлено: Пересмотрен ответ, чтобы уточнить, что не для непакетных установок

Если вы установили с помощью ручной установки, которая была указана первой на youtube-dl github странице, то этот метод позволит вам использовать youtube-dl с вашим пользовательским именем youtubedl, не видя youtube-dl в автозаполнении. На вашем терминале:

$ cd /usr/local/bin/

$ sudo mv youtube-dl youtubedl

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

$ youtubedl -F 'https://www.youtube.com/watch?v=BaW_jenozKc'

Вы также можете обновить его в будущем:

$ youtubedl -U

Гарантия

  • Версии: 2016.01.15, переименование и последующее обновление до 2016.04.05. См. youtube-dl --version
  • Проверено только при установке youtube-dl с помощью инструкций по ручной установке на странице youtube-dl github, методы установки пакетов не проверялись. Поэтому этот ответ может не сработать, если youtube-dl был установлен с помощью системы управления пакетами, которая может иметь жестко закодированное место установки

Объяснение

Инструкции youtube-dl github page были следующими:

$ sudo curl https://yt-dl.org/latest/youtube-dl -o /usr/local/bin/youtube-dl
$ sudo chmod a+rx /usr/local/bin/youtube-dl
  • Это загружает youtube-dl двоичный файл в /usr/local/bin.
  • Пути в пределах $PATH появляются при автозаполнении.
  • /usr/local/bin действительно является одним из таких путей в $PATH, поэтому youtube-dl появится в автозаполнении Bash.

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

$ cd /usr/local/bin/

Rename:

$ sudo mv youtube-dl youtubedl
  • /usr/local/bin - это ограниченный каталог, поэтому мы используем sudo

Старое имя больше не будет найдено:

$ which youtube-dl
youtube-dl not found

И теперь мы можем обращаться к нему по новому имени:

$ which youtubedl
/usr/local/bin/youtubedl

Мы можем проверить, что он все еще работает, например, обновить его с помощью -U:

$ youtubedl -U
Updating to version 2016.04.05 ...
Updated youtube-dl. Restart youtube-dl to use the new version.

Протестировать его функциональность видео, например, извлечение форматов:

$ youtubedl -F 'https://www.youtube.com/watch?v=BaW_jenozKc' | head
[youtube] BaW_jenozKc: Downloading webpage
[youtube] BaW_jenozKc: Downloading video info webpage
[youtube] BaW_jenozKc: Extracting video information
[youtube] BaW_jenozKc: Downloading MPD manifest
[info] Available formats for BaW_jenozKc:
format code  extension  resolution note
249          webm       audio only DASH audio   47k , opus @ 50k, 57.05KiB
250          webm       audio only DASH audio   66k , opus @ 70k, 79.56KiB
171          webm       audio only DASH audio   74k , vorbis@128k (44100Hz), 89.59K
iB
140          m4a        audio only DASH audio  127k , m4a_dash container, mp4a.40.2
@128k (44100Hz), 154.06KiB

Из исходного кода update. py, строка 86:

filename = sys.argv[0]
  • Таким образом, этот код обновления определяет имя файла текущей программы, что позволяет вам иметь yourcustomname -U и все равно успешно обновляться.

-1
27.03.2019, 00:05
3 ответа

Я не знаю ни одной программы, которая принимает параметр и отправляет его по TCP-соединению.

Однако вы как бы ответили на свой вопрос в своих комментариях, в частности, в следующей строке.

ENTRYPOINT ["/bin/sh", "-c", "mycommand"]

Я понимаю, что вы, похоже, хотите, чтобы в вашем образе было минимальное количество приложений, но я считаю, что лучшим решением будет иметь shellи netcat., а затем использовать исходную команду. Ну, по крайней мере, чтобы проверить, что вы пытаетесь сделать.

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

Одна мысль, я вижу этот пример ,показывает настройку Python для запуска скрипта,

FROM python:2.7-slim AS build-env
ADD. /app
WORKDIR /app

FROM gcr.io/distroless/python2.7
COPY --from=build-env /app /app
WORKDIR /app
CMD ["hello.py", "/etc"]

что может быть проще/быстрее, чем разработка Cпрограммы для всего этого, но тогда фактически вы используете Python как SHELL . Наконец, если вы думаете, что socatбудет делать то, что вы хотите, не могли бы вы использовать socatдля чтения из файла (, который вы включаете в свой образ ), и этот файл содержит литеральную строку.

1
28.01.2020, 05:08

Я написал собственное небольшое приложение для реализации того, что мне нужно. Читает аргументы и записывает их в сокет. Жаль, что его еще не было, но в таких инструментах, как ncи socat, доступны только более сложные функции. Возможно, я мог бы найти время, чтобы написать патч для nc, чтобы также принимать входные данные от аргумента.

Комментарии к комментариям -Мне немного грустно читать, что включение полной оболочки и создание из нее подпроцессов является новой нормой. Чистые накладные расходы нам не нужны.

0
28.01.2020, 05:08

Думаю, вы могли бы использовать newlisp, например

newlisp -e '(write-line (net-connect "localhost" 3456) "go for it")'

и измените параметры по желанию.

Я почти уверен, что вы могли бы использовать perlили другие интерпретаторы, хотя newlispдовольно мал, и его также можно скомпилировать в статическую программу.

В приведенном выше примере программа подключается к localhostпорту 3456и выдает строку go for itна сокете, после чего завершается. Перейдите на домашний сайт newlisp для более подробной информации.

1
28.01.2020, 05:08

Теги

Похожие вопросы