Вход ssh удаленные команды к 'bash_history'

$ cat testdata
CTD1234abcdTRN0001
AA 5678defg
BB 8910erty
CTD5678qwerTRN5678
AA 9876bvcn
BB 8765zxcv
CTDxxxxxxxxTRNyyyy
AA foobarfo
BB foobarfo
AAABBBB11115678xxxx
BBBCCCC22221234YYYY
MTD0001abcdTRN12345 abcdedfg
AA 0002bcde
BB 0003defg
CCCDDDD33331234zzzz
MTD0003qwerTRN56789 defghigk
AA 9876bvcn
BB 8765zxcv
XXXBBBB11115678aaaa
YYYCCCC22221234bbbb

$ awk '/^(C|M)TD/ { s=match($0, /[[:space:]]/); postfix=substr($0, 12, length($0)-s); print; next } /^(AA|BB)[[:space:]]/ { print $0 postfix; next } 1' testdata
CTD1234abcdTRN0001
AA 5678defgTRN0001
BB 8910ertyTRN0001
CTD5678qwerTRN5678
AA 9876bvcnTRN5678
BB 8765zxcvTRN5678
CTDxxxxxxxxTRNyyyy
AA foobarfoTRNyyyy
BB foobarfoTRNyyyy
AAABBBB11115678xxxx
BBBCCCC22221234YYYY
MTD0001abcdTRN12345 abcdedfg
AA 0002bcdeTRN12345
BB 0003defgTRN12345
CCCDDDD33331234zzzz
MTD0003qwerTRN56789 defghigk
AA 9876bvcnTRN56789
BB 8765zxcvTRN56789
XXXBBBB11115678aaaa
YYYCCCC22221234bbbb
6
02.04.2014, 01:37
1 ответ

A # в sshd_config интерпретируется как начало комментария, и все, что следует за ним, игнорируется. Хотя (согласно sshd_config (5) ) "" можно использовать для цитирования аргументов, содержащих пробелы, они не цитируют # .

Это также объясняет получаемую вами ошибку. sshd передает только bash следующее:

if [[ -z $SSH_ORIGINAL_COMMAND ]]; then bash; else printf "

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

Чтобы предотвратить такое поведение, нельзя использовать литерал # :

  • Поскольку printf все равно используется здесь, использование его возможностей для использования символов с экранированием обратной косой чертой оказывается очень кстати. # можно записать как \ x23 (шестнадцатеричный), \ 43 (восьмеричный), \ u23 (Unicode, шестнадцатеричный до 4 шестнадцатеричные цифры) или даже \ U23 (Unicode, шестнадцатеричный код до 8 шестнадцатеричных цифр). То же самое работает для echo -e . Обратите внимание, что \ необходимо указать, поэтому используйте "\ 43" , '\ 43' или \\ 43 .

  • В случаях, когда вам не нужны echo или printf , вы можете получить bash (также работает с zsh ), чтобы выполните замену, используя $ 'string' . Например: чтобы выполнить touch foo # bar , вы можете написать touch $ 'foo \ x23bar' . Если значение меньше максимально допустимого количества цифр (3 для восьмеричного, 2 для шестнадцатеричного и 4 или 8 соответственно для Unicode), вы должны использовать ведущие нули, чтобы избежать неправильной интерпретации. Например: $ 'foo \ u23bar' оценивается как foo⎺r , а $ 'foo \ u0023bar' дает ожидаемое foo # bar ].

  • Избегайте использования # (буквального или другого) в целом, поместив все функции в сценарий, а затем просто поместив ForceCommand / path / to / script в вашу конфигурацию.

Второй вариант также позволяет отказаться от printf , более широко используя параметр формата дата . Вместо

printf "\x23`date +%s`\n$SSH_ORIGINAL_COMMAND\n" >> .bash_history

вы можете написать

date $'+\x23%s'"${SSH_ORIGINAL_COMMAND//%/%%}" >> .bash_history
3
27.01.2020, 20:30

Теги

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