새 tmux 창에서 명령을 실행하려고 합니다. 간단한 콘솔/터미널 PDF 리더. 스크립트에는 매개변수, PDF 파일이 필요하며 파일 이름에는 공백이 포함될 수 있습니다. 나는 이것을 시도했습니다 :
#!/bin/bash
tmux new-window "pdftotext -layout -nopgbrk "${1}" - | less"
공백이 없는 파일에 대해 작동합니다 1.pdf
. 예를 들어 , sh
대신 , 대신 에 효과가 없습니다.bash
$1
"$1"
"${1}"
답변1
tmux new-window
명령을 쉘에 전달하십시오. 괜찮습니다. 명령은 파이프이고 이를 처리하려면 쉘이 필요합니다. 그러나 이는 명령을 문자열로 처리한 다음 이를 해석하는 쉘이 있음을 의미합니다(예: sh -c
이렇게 함).
tmux new-window
(예를 들어) 여러 인수를 사용하여 ssh
내부(원격) 쉘에 대한 명령 문자열을 작성하는 것이 가능한 것 같습니다 . ssh
나는 여전히 이러한 도구에 대해 단일 주장을 제시하는 것을 선호합니다.
내부 쉘을 인용해야 하며, 스크립트를 해석하는 쉘도 인용해야 합니다. 즉, 쉘이 $1
따옴표를 대체하고 제거한 후에 문자 그대로 사용되지 않고 전달된 문자열이 인용 tmux new-window
되어야 하는 모든 것이 쉘 내에서 적절하게 인용되는 쉘 명령을 형성하도록 전체 tmux 명령을 만들어야 합니다. .
분명한 아이디어는 추가 따옴표를 삽입하는 것입니다. 그러나 여기에는 결함이 있습니다.
# 결함, tmux new-window "pdftotext -layout -nopgbrk \"${1}\" - | less"하지 마세요.#결점도있지마세요tmux 새 창 "pdftotext -layout -nopgbrk '${1}' - | less"
"
$
, `
, \
또는를 포함하는 !
인수는 '
하나의 명령 및/또는 다른 명령을 중단합니다. 더 나쁜 것은 코드 삽입 취약점이 발생한다는 것입니다. 즉, 불운하거나 악의적인 매개변수의 경우 스크립트가 매개변수의 일부를 셸 코드로 실행합니다.
귀하의 스크립트는 Bash를 사용합니다. Bash 자체 $1
에 인용된 형식으로 확장하도록 요청할 수 있습니다.안전한방법. 이는 다음으로 인해 발생합니다.Q
수정자:
#!/bin/bash
tmux new-window "pdftotext -layout -nopgbrk ${1@Q} - | less"
확장되는 것이 무엇이든 $1
외부 쉘은 ${1@Q}
내부 쉘을 올바르게 참조하는 것처럼 보이는 형태로 확장됩니다.