Передача данных по конвейеру в ssh
(как и вы) - это правильный способ передачи входных данных команде, выполняемой через SSH.
Проблема заключается в том, что gpg
требуется два входных потока для чтения:
/ 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'
Не комментируйте команду.
Вместо этого поместите :
впереди, а не #
. Это сделает текстовые аргументы вашей команды для нулевой утилитой :
, которая ничего не делает при запуске . Аргументы размечаются и анализируются, потому что это все еще команда, но с ними больше ничего не делается.
Бывают случаи, когда это не подходит :, в частности, когда выяснение самой команды имеет побочные эффекты. Простой пример: подстановка команды:
$ : 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 , чтобы стереть до начала строки, :,а затем получите безопасную команду, оставив только одно слово, которое вам нужно.
То же самое можно сделать и с комментариями; вам не нужно переключаться на :
, если вы хотите использовать другой ярлык:
Определите функцию, которая выводит свой последний позиционный параметр:
lastarg () { test $# -eq 0 && return 1; while [ $# -gt 1 ]; do shift; done; printf '%s' $1; }
Создайте привязку клавиш, которая вызывает:
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
Используйте встроенную команду оболочки !$
, которая соответствует последнему аргументу.
Я также использую zsh, и это работает для доступа к последнему аргументу закомментированной команды для меня в оболочке.
Вы можете добавить к своему~/.zshrc
:
zshaddhistory() {
local histchars=
print -Sr -- ${1%$'\n'}
fc -p
}
То есть в специальной функции-хуке zshaddhistory
, вызываемой перед добавлением текущей командной строки в историю, добавить ее самим с пустым histchars
, что отключило бы обработку комментариев для print -S
. fc -p
гарантирует, что командная строка не будет добавлена в историю еще раз.