ssh
SSH를 사용하면 마지막 사용법에 표시된 대로 원격 사용자가 서버에 대화형으로 로그인하지 않고도 특정 명령을 실행할 수 있습니다.
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
\U23
echo -e
\
"\43"
'\43'
\\43
echo
또는 가 필요하지 않은 경우 ( 에서도 작동함)printf
로 바꿀 수 있습니다 .bash
예를 들어, 해야 할 일을 쓸 수 있습니다. 값이 허용되는 최대 자릿수(8진수는 3, 16진수는 2, 유니코드는 각각 4 또는 8)보다 작은 경우 오해를 피하기 위해 앞에 0을 사용해야 합니다. 예: while을 계산하면 예상값이 나옵니다.zsh
$'string'
touch foo#bar
touch $'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