Как получить доступ к последнему аргументу закомментированной команды

Передача данных по конвейеру в ssh (как и вы) - это правильный способ передачи входных данных команде, выполняемой через SSH.

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

  • один (STDIN) для чтения данных, которые необходимо зашифровать,
  • еще один ( интерактивный терминал / dev / tty ), чтобы прочитать кодовую фразу (поэтому вам нужно передать параметр -t в ssh ).

Если вы объедините эти два значения и попытаетесь использовать STDIN для обеих целей, то потребуется способ сигнализировать EOF для разделения двух входов. Однако ssh также прочитает конец файла и закроет перенаправленный входной поток.

Единственное практическое решение, которое я могу себе представить, - это сохранить данные в файл, а затем зашифровать их с помощью gpg (требуется два отдельных ssh ] invocations) ::

pv file | ssh ... '(umask 077; cat > file.unencrypted)'
ssh -t ... 'gpg -se -r ... < file.unecrypted > file.gpg; rm -f file.unencrypted'
4
15.04.2018, 12:23
4 ответа

Не комментируйте команду.

Вместо этого поместите :впереди, а не #. Это сделает текстовые аргументы вашей команды для нулевой утилитой :, которая ничего не делает при запуске . Аргументы размечаются и анализируются, потому что это все еще команда, но с ними больше ничего не делается.


Бывают случаи, когда это не подходит :, в частности, когда выяснение самой команды имеет побочные эффекты. Простой пример: подстановка команды:

$ : log $(find -print -delete) --target /var/run/cache

В этом случае команда внутри $(...)будет запущена и подставлена ​​в аргументы :, даже если исходная команда никогда не запустится. Менее -деструктивным случаем будет${foo:=default}раскрытие параметра , побочным эффектом которого является присвоение значения $foo.

Наконец, перенаправления или конвейеры по-прежнему будут иметь место:

$ : foo > outfile
$ : bar | grep x |...

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


Если у вас нет особых проблем с вашей командой, это совершенно безопасно и работает в zsh , Bash и любой POSIX -совместимой оболочке (через альт -. впоследствии поведение не будет работать везде ).

Если вам нужно именно последнее слово, zsh предоставляет настраиваемые привязки клавиш и команды, которые можно использовать для управления командной строкой. Если вы bindkey '^K' kill-region, то вы можете перейти назад до слова, Ctrl-K , чтобы стереть до начала строки, :,а затем получите безопасную команду, оставив только одно слово, которое вам нужно.

4
27.01.2020, 20:48

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

  1. Определите функцию, которая выводит свой последний позиционный параметр:

    lastarg () { test $# -eq 0 && return 1; while [ $# -gt 1 ]; do shift; done; printf '%s' $1; }
    
  2. Создайте привязку клавиш, которая вызывает:

    lastarg $(history 2 | head -1)
    

    и вставляет вывод.

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

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

Если вы достаточно уверены, что ничего плохого произойти не может (без кавычек <, >, &, $(), \``,;,#, and no0 single" or' `то вы можете сделать это, чтобы получить цитируемый последний "аргумент" из строки комментария:

# dummy foo\ \ \ bar
eval : $(history 2 | awk 'NR==1 { sub(" *[0-9]* *#",""); print; }') \; echo '"$_"'
    + eval : dummy 'foo\' '\' '\' bar ';' echo '"$_"'
    ++ : dummy 'foo   bar'
    ++ echo 'foo   bar'
    foo   bar
3
27.01.2020, 20:48

Используйте встроенную команду оболочки !$, которая соответствует последнему аргументу.

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

2
27.01.2020, 20:48

Вы можете добавить к своему~/.zshrc:

zshaddhistory() {
  local histchars=
  print -Sr -- ${1%$'\n'}
  fc -p
}

То есть в специальной функции-хуке zshaddhistory, вызываемой перед добавлением текущей командной строки в историю, добавить ее самим с пустым histchars, что отключило бы обработку комментариев для print -S. fc -pгарантирует, что командная строка не будет добавлена ​​в историю еще раз.

1
27.01.2020, 20:48

Теги

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