これは間違いなく動作します。実行でき./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 -- "$@"
(コマンドラインを短くするために暗号化されたスクリプトを変数に入れたので、スーパーユーザーが列を表示するのに適しています。)