新しい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"
"
$
、、、またはを含む引数は、 1つのコマンド`
および/または別のコマンドを中断します。さらに悪いことは、コード挿入の脆弱性が発生することです。つまり、不運または悪意のあるパラメータの場合、スクリプトはパラメータの一部をシェルコードとして実行します。\
!
'
あなたのスクリプトはBashを使います。 Bash自体$1
に引用された形式に拡張するように要求できます。安全方法。これは次のために発生します。Q
修飾子:
#!/bin/bash
tmux new-window "pdftotext -layout -nopgbrk ${1@Q} - | less"
拡張されているものが何であれ、$1
外部シェルは${1@Q}
内部シェルを正しく参照するように見える形に拡張されます。