SSH 원격 명령을 "bash_history"에 기록합니다.

SSH 원격 명령을 "bash_history"에 기록합니다.

sshSSH를 사용하면 마지막 사용법에 표시된 대로 원격 사용자가 서버에 대화형으로 로그인하지 않고도 특정 명령을 실행할 수 있습니다.

usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport] [-Q protocol_feature]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

원격 명령을 사용하여 ssh를 호출하면 파일이 .bash_history업데이트되지 않습니다(즉, 원격 명령이 파일에 추가되지 않습니다 .bash_history). 나는 다음을 추가하여 이 효과를 "시뮬레이트"했습니다 /etc/ssh/sshd_config.

ForceCommand if [[ -z $SSH_ORIGINAL_COMMAND ]]; then bash; else printf "$SSH_ORIGINAL_COMMAND\n" >> .bash_history; bash -c "$SSH_ORIGINAL_COMMAND"; fi

위 명령은 환경 변수 $SSH_ORIGINAL_COMMAND가 비어 있는지 확인합니다.

  • 그렇다면 원격 명령이 실행되지 않으며 간단히 bash.
  • 그렇지 않으면 $SSH_ORIGINAL_COMMAND추가되고 .bash_history그 안의 원격 명령이 실행됩니다.$SSH_ORIGINAL_COMMAND

.bash_history예상대로 작동하지만 더 많은 것이 필요합니다. 현재 타임스탬프도 추가하고 싶습니다. 이를 위해 다음 명령을 추가했습니다 /etc/ssh/sshd_config.

ForceCommand if [[ -z $SSH_ORIGINAL_COMMAND ]]; then bash; else printf "#`date +%s`\n$SSH_ORIGINAL_COMMAND\n" >> .bash_history; bash -c "$SSH_ORIGINAL_COMMAND"; fi

ssh하지만 서버에 연결 하려고 하면 다음과 같은 오류가 발생합니다.

bash: -c: line 0: unexpected EOF while looking for matching `"'
bash: -c: line 1: syntax error: unexpected end of file
Connection to 127.0.0.1 closed.

#이전에 제거 하면 date +%s제대로 작동합니다. 하지만 타임스탬프가 올바른 파일 형식 #이므로 이보다 먼저 인쇄 해야 합니다 ..bash_history

답변1

in은 주석의 시작으로 해석되며 그 뒤의 모든 내용은 무시됩니다 #. sshd_config(에 따르면 sshd_config(5))은 ""공백이 포함된 인수를 인용하는 데 사용될 수 있지만 인용되지는 않습니다 #.

이는 또한 귀하가 받고 있는 오류에 대해 설명합니다. sshd다음 항목만 전달하세요 bash.

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

"명령줄이 첫 번째 줄 다음에 끝나기 때문에 두 번째 줄을 찾을 수 없습니다 .

#이 동작을 방지하려면 텍스트를 사용하면 안 됩니다.

  • 어쨌든 printf여기서 사용된 것처럼 백슬래시를 사용하여 문자를 이스케이프하는 기능을 사용하는 것은 매우 편리합니다. (16진수), (8진수), (유니코드, 16진수 최대 4자리의 16진수) 또는 (유니코드, 16진수 최대 8자리의 16진수) #로 쓸 수 있습니다 . 에도 적용됩니다 . 따옴표로 묶어야 하므로 , 또는 를 사용 하세요 .\x23\43\u23\U23echo -e\"\43"'\43'\\43

  • echo또는 가 필요하지 않은 경우 ( 에서도 작동함) printf로 바꿀 수 있습니다 . bash예를 들어, 해야 할 일을 쓸 수 있습니다. 값이 허용되는 최대 자릿수(8진수는 3, 16진수는 2, 유니코드는 각각 4 또는 8)보다 작은 경우 오해를 피하기 위해 앞에 0을 사용해야 합니다. 예: while을 계산하면 예상값이 나옵니다.zsh$'string'touch foo#bartouch $'foo\x23bar'$'foo\u23bar'foo⎺r$'foo\u0023bar'foo#bar

  • #모든 기능을 스크립트에 넣은 다음 ForceCommand /path/to/script구성에 넣어 함께(문자 그대로 또는 다른 방식으로) 사용하지 마십시오.

printf두 번째 옵션을 사용하면 서식 옵션을 보다 광범위하게 사용하여 삭제할 수도 있습니다 date. 바꾸다

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

당신은 쓸 수 있습니다

date $'+\x23%s'"${SSH_ORIGINAL_COMMAND//%/%%}" >> .bash_history

관련 정보