スクリプトを使用して標準入力からshを呼び出し、コマンドライン引数を渡します。

スクリプトを使用して標準入力からshを呼び出し、コマンドライン引数を渡します。

これは間違いなく動作します。実行でき./test1.sh cats、パラメータがcats正しく渡されましたls

$ cat test1.sh
#!/bin/sh
ls -l $1

2番目の例(最初の例と内容は同じですが暗号化されています)が同じように機能するようにする方法を教えてください。パスワードは「パスワード」です。 openssl上記のスクリプトを出力してls -l実行します。しかし、コマンドライン引数をどのように渡しますか?

$ cat test2.sh
#!/bin/sh
echo "U2FsdGVkX1/m01Eg0CvZ7DiBi5Nf81+JrCWfKIDI9WtbkTZIVLhZskkKIioVfbSe"|openssl enc -base64 -d -aes-256-cbc|sh $1

明確にするためにtest2.sh

$ cat test3.sh
#!/bin/sh
printf '%s\n' '#!/bin/sh' 'ls -l $1' | sh $1

ベストアンサー1

質問の以前のバージョンではすでにその内容がありました。-sオプションを次に渡しますsh

echo "U2FsdGVkX1/m01Eg0CvZ7DiBi5Nf81+JrCWfKIDI9WtbkTZIVLhZskkKIioVfbSe" | openssl enc -base64 -d -aes-256-cbc | sh -s "$1"

これは、シェルが標準入力からコマンドを読み取ると、コマンドライン(以降-s)の引数を標準入力から来るスクリプトコードの位置引数として受け入れるように指示します。もちろん、シェル変数は妥当な理由がない限り常に引用する必要があり、"@"長期的には(すべての引数)をシェルに渡す方が便利です。

test1.shしたがって、;のシェル変数へのすべての参照を引用することも賢明です。例えば、

ls -l "$1"

上記の最初の解決策は、「一般」パラメータに対して機能するようです。ただし、次に始まるパラメータの場合を処理するには-、好ましくはsh -s -- "$1"(または  "$@")を実行します。例えば、

#!/bin/sh
code="U2FsdGVkX1/m01Eg0CvZ7DiBi5Nf81+JrCWfKIDI9WtbkTZIVLhZskkKIioVfbSe"
echo "$code" | openssl enc -base64 -d -aes-256-cbc | sh -s -- "$@"

(コマンドラインを短くするために暗号化されたスクリプトを変数に入れたので、スーパーユーザーが列を表示するのに適しています。)

おすすめ記事