tmux 새 창 명령과 공백이 포함된 인수 - bash var

tmux 새 창 명령과 공백이 포함된 인수 - bash var

새 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}내부 쉘을 올바르게 참조하는 것처럼 보이는 형태로 확장됩니다.

관련 정보