별칭으로 실행되지 않는 명령을 사용하는 SSH

별칭으로 실행되지 않는 명령을 사용하는 SSH

tail -f내 로컬 서버와 내가 가지고 있는 응용 프로그램의 최신 로그 파일에 원격으로 액세스하려면 다음 명령을 사용합니다 .

이 명령은 명령줄에서 완벽하게 작동합니다.

ssh user@hostname 'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'

문제는 별칭(또는 함수)으로 만들 때 ls -1r로컬 컴퓨터에서 완료를 평가하고 이를 원격 컴퓨터에 전달하려고 한다는 것입니다.

alias latestbotlogs="ssh user@hostname 'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'"

function latestbotlogs {
    ssh user@hostname 'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'
}

SSH를 통해 액세스할 수 있는 원격 시스템에서 전체 명령을 평가하려면 어떤 구문을 사용해야 합니까?

미리 감사드립니다!

답변1

별칭의 경우 일부 이스케이프가 필요합니다.

alias latestbotlogs="ssh user@hostname 'tail -f \\\$\\(ls -1r \\~/Development/python/twitter-bot/logs/*.log \\| head -1\\)'"

또는

alias latestbotlogs='ssh user@hostname '\''tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'\'

두 번째 버전은 더 쉽습니다. 인용해야 하는 모든 연산자에 대해 생각할 필요가 없습니다.

기능은 그대로 작동해야 합니다.

답변2

다소 복잡한 인용 이스케이프를 올바르게 처리하는 또 다른 방법은 다음과 같습니다.

 alias botlogs='ssh user@host "ls -r ~/whatever/*log | head -1 | xargs tail -f"'
 # if (selected) filename contains backslash or quotemark(s) 
 # need -d'\n' on GNU and I don't know good solution on other
 # this also fails if filename contains whitespace, but so did $( )

함수가 해킹 없이 작동해야 한다는 데 동의하지만 일반적으로 함수는 별칭보다 일관되고 유연하며 더 좋습니다.

추신: ls출력이 파이프(또는 리디렉션)되면 항상 1열 형식을 사용하는데, 여기서는 필요하지 않습니다 -1.

답변3

latestbotlogs다음과 같이 작은따옴표로 묶인 문자열을 에 할당하여 별칭을 설정할 수 있습니다 .

alias latestbotlogs='ssh user@hostname '\''tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'\'

여기서 표현식은 \'셸에서 작은따옴표를 보호하고 이를 결과 명령에 연결하는 데 사용됩니다. 보존되었는지 확인할 수 있습니다.

$ alias latestbotlogs
alias latestbotlogs='ssh user@hostname '\''tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'\'''

별칭을 사용하는 경우:

alias latestbotlogs="ssh user@hostname 'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'"

명령 대체는 정의에 따라 즉시 평가됩니다. 이는 작은따옴표를 \이스케이프하거나(with) 큰따옴표( )로 묶을 때 특별한 의미를 잃기 때문에 발생합니다 ". (인용하다:인용하다"오픈 그룹 기본 사양 2018년 7호판"을 참조하세요.
핵심은 다음과 같습니다. 별칭이 다음과 같은 경우 원격 명령을 작은따옴표로 묶어 보호하면 충분합니다.옮기다하지만 별칭이 다음과 같을 때 포함된 명령이 바뀌는 것을 방지하지 마십시오.만들어진.

"'"다음 대안을 사용할 수도 있습니다 \'.

alias latestbotlogs='ssh user@hostname '"'"'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'"'"

또는 전체 명령을 큰따옴표로 묶고 일부 이스케이프를 추가합니다.

alias latestbotlogs="ssh user@hostname 'tail -f \$(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'"

마지막 형식에서는 큰따옴표( $, `및 ) \내에서 특별한 의미를 유지하는 모든 문자를 이스케이프해야 합니다(여기서는 하나만 있습니다 $).

대신 함수가 제대로 작동해야 합니다.

관련 정보