x-shellscriptをx-executableに変換した後、パラメータ$ 0がフルパスではなくデフォルト名のみを提供するのはなぜですか?

x-shellscriptをx-executableに変換した後、パラメータ$ 0がフルパスではなくデフォルト名のみを提供するのはなぜですか?

私の問題は、このパラメータが$0同じ結果を提供します。${0##*/}これは、SHCプログラムを使用してx-shellscriptをx-executableに変換した後に発生することです。

オペレーティングシステム:Debiab-8.2-jessie SHCバージョン:3.8.7 cmd使用:shc -f script.bash

コンパイルされたscript.xは、追加のbinパス(sudoには知られていません)にあります。 ノート私は$ 0パラメータを印刷するhello worldプログラムを作成し、常にデフォルトの名前を提供します!

私のスクリプトファイルには以下が含まれています。

#!/bin/bash
((!EUID)) || exec sudo "$0"
# shellcode ...

実行すると、次の結果が表示されます。

sudo:スクリプト名:コマンドが見つかりません。

確認した結果、パラメータがx実行可能ファイルと$0同じか内部にある${0##*/}ことがわかりました!$(basename $0)

スクリプトに絶対パスを入れずにどのように処理できますか?それとも、SHCを使用してシェルをx実行可能ファイルにコンパイルするときに何を知る必要がありますか?

答え1

SHCを選ぶ理由は何ですか?

まず、「愛好家」の動機を考えるときにSHCを使用するのはなぜですか?以下はその説明から抜粋したものです。

実行されると、コンパイルされたバイナリはshell -cオプションを使用してコードを復号化して実行します。残念ながら、実際のCプログラムのように速度は向上しません。

コンパイルされたバイナリはまだシェルコードの最初の行で指定されたシェル(つまり#!/ bin / sh)に依存しているため、shcは完全に独立したバイナリを生成しません。

SHCの主な目的は、シェルスクリプトが変更またはチェックされないように保護することです。

  • 私の考え(簡単に説明します):たとえあなたの動機が修正を防ぐために「主な目的」と明記されているとしても、決心した人はまだ元のスクリプトを復元(したがって修正)することができます! SHCは本質的に以下を提供します。あいまいなセキュリティ,次のように使用した場合基本的なセキュリティ対策これが役に立たない場合は、SHCを捨てて他のほとんどのようにシェルスクリプトを使用することをお勧めします。シェルスクリプトの実際のセキュリティが必要な場合は、SHCや「コンパイラ」を使用せずに特定の質問をすることをお勧めします。

特定の$0の質問

下記からSHC 3.8.9をダウンロードしました。このページただ試してみてください。

Ubuntu 14.04 LTSでは問題を再現できません。

#!/bin/bash
echo "Hello, world. My name is \`$0'"

テストの実行

$ ./shc -f my_test.bash
$ ~/path/to/my_test.bash.x

Hello, world. My name is `~/path/to/my_test.bash.x'

したがって、明らかに私たちのシステムは異なります。あなたのOS、SHCバージョン、特定shc「コンパイル」に使用するシェルスクリプトとコマンドライン。

なぜパスが必要なのですか?

スクリプトがパスを知る必要があるのはなぜですか?ファイルを保存するためにスクリプトを使用していますか?ユーザーが指定しなかった場合、実行されるディレクトリは「デフォルト」ですか?これが良いアイデアかどうかは意見の問題ですが、動機を理解すると答えの範囲を絞り込むのに役立ちます。

現在のディレクトリを取得する方法

このpwdコマンドは現在のディレクトリを取得します。ほとんどの場合、以下を使用してスクリプトのフルパスを組み合わせることができます(明示的な相対パスを使用して実行されると仮定)。

realname="`pwd`/$0"

...次のような値を生成します。

/path/to/script/./yourscript.bash.x

追加の項目は./単に「現在のディレクトリ」を意味するため、審美的に残念ですが、結果に悪影響を及ぼすことはありません。

スクリプトがあなたのものである場合は、代わりに$PATH使用する必要があります。しかし、私たちは元の質問の範囲を超えているので、パス名を決定するのは難しいプロセスになる可能性があることに簡単に言及します。特にそのような方法を使用する必要がある場合は、さらにそうです。その後、他の質問に任せて、これらの行に沿って具体的な問題の説明を書くことをお勧めします。whichpwd

答え2

これは、パス検索でバイナリを見つけると、bash(および/またはld.so)が実行可能ファイルのフルネームをargv [0]に入れないためです。依存関係パスの代わりに実行時にディレクトリを指定すると、正しい名前が得られます。

関連情報