Как выполнить удаленную команду и передать в локальном файле, как введено?

Используйте обратные ссылки. Ответ на Ваш первый вопрос (2-й, 3-й символ то же):

egrep '^.(.)\1'

http://www.regular-expressions.info/brackets.html является простым введением к обратным ссылкам.

23
01.08.2014, 19:19
3 ответа

Вы пропустили всего один символ =)

ssh user@socket command < /path/to/file/on/local/machine
24
27.01.2020, 19:42
  • 1
    Конечно! Интересно, почему я не рассматривал перенаправление ввода по ssh?! –  jsj 26.10.2012, 16:08
  • 2
    Что, если удаленная команда может только взять аргумент файла и не чтение от stdin? –  iruvar 26.10.2012, 17:48
  • 3
    @ChandraRavoori в этом случае необходимо скопировать его с scp прежде. –  rush 26.10.2012, 18:53
  • 4
    @ChandraRavoori можно попытаться дать ему аргумент файла /dev/stdin или -. May или не может работать (/dev/stdin файл, но поиск его перестанет работать), –  derobert 26.10.2012, 19:03
  • 5
    @derobert и порыв, играемый вокруг с ним немного и обнаруженный hacky способ сделать это замена процесса использования под ударом. Это все еще подвергается ограничению поиска и может стать громоздким со всем дополнительным заключением в кавычки, которое будет необходимо. Пример следует. кошка test.file | ssh user@machine 'колотит-c "туалет-l <(кошка-)"' –  iruvar 26.10.2012, 22:04

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

  1. Установите обратный туннель SSH. См. также, что SSH легко копирует файл в локальную систему
  2. Смонтируйте дерево каталогов своей машины, содержащей файл для совместного использования на удаленной машине с SSHFS. (Пример)
4
27.01.2020, 19:42
  • 1
    Так или иначе этот путь требует дополнительных перемещений перед выполнением команды. –  rush 27.10.2012, 09:09
  • 2
    @Gilles: Я думаю, что оригинальное название вводило в заблуждение, и Вы поняли его вопрос на основе вводящего в заблуждение заголовка. Насколько я могу сказать, думал, он на самом деле не хотел действовать на локальный файл, но просто передавать его в как вход. (Но Ваш ответ удивителен, если я понимаю это правильно! Возможно, я должен задать вопрос, на который Вы ответили, только чтобы дать Вам место для помещения ответа, где Вы получите надлежащий кредит на него.) я отредактировал заголовок вопросов для создания этого согласовывающимся с телом и с выбранным ответом. спасибо –  iconoclast 01.08.2014, 19:10
  • 3
    @iconoclast я не помню своего настроения, когда я записал это, но я иду этим ответом. Это требует некоторой установки, но имеет преимущество обобщения вне непосредственного требования к другим случаям, где не достаточно скопировать вход. Я также упомянул бы перенаправление, если бы кто-то еще не сделал его. Более общий вопрос много раз задавали в немного отличающихся формах. –  Gilles 'SO- stop being evil' 01.08.2014, 20:02
  • 4
    Хорошо, я, должно быть, неправильно понял Ваш ответ. Я не попробовал его, но вывел это, так как Вы устанавливали обратный туннель (от удаленного до локального хоста?) Вы позволяли локальному файлу быть измененным удаленной машиной. Что не имеет место? –  iconoclast 01.08.2014, 20:21
  • 5
    @iconoclast Да, это позволяет удаленной машине изменять локальный файл (в дополнение к разрешению этого считать его, который является тем, чего вопрос требует). –  Gilles 'SO- stop being evil' 01.08.2014, 20:22
# What if remote command can only take a file argument and not read from stdin? (1_CR)
ssh user@socket command < /path/to/file/on/local/machine
...
cat test.file | ssh user@machine 'bash -c "wc -l <(cat -)"'  # 1_CR

Как альтернатива bash замена процесса <(cat -) или < <(xargs -0 -n 1000 cat) (см. ниже), можно просто использовать xargs и cat передавать содержание по каналу указанных файлов к wc -l (который является более портативным).

# Assuming that test.file contains file paths each delimited by an ASCII NUL character \0
# and that we are to count all those lines in all those files (provided by test.file).

#find . -type f -print0 > test.file
# test with repeated line count of ~/.bash_history file
for n in {1..1000}; do printf '%s\000' "${HOME}/.bash_history"; done > test.file

# xargs & cat
ssh localhost 'export LC_ALL=C; xargs -0 -n 1000 cat | wc -l' <test.file

# Bash process substitution
cat test.file | ssh localhost 'bash -c "export LC_ALL=C; wc -l < <(xargs -0 -n 1000 cat)"'
1
27.01.2020, 19:42

Теги

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