Linuxで実行できないファイルへの実行可能なシンボリックリンクは可能ですか?

Linuxで実行できないファイルへの実行可能なシンボリックリンクは可能ですか?

リポジトリに保存されているいくつかのPythonスクリプトがあります。プレーンテキストファイルで実行可能ビットが設定されている場合、オンラインストアページはそのスクリプトをプレーンテキストページではなくバイナリにダウンロードします。したがって、私はこのスクリプトを実行不可能にするほうが良いです。

しかし、私もそれを使用したいと思います。原則として、次のようにすることができます。

sudo ln -s /path/to/wherever/I/have/put/myscript.py /usr/bin/

...その後、スクリプトが実行可能でshebangがある場合は、コマンドラインから次を呼び出すことができます。

myscript.py [ARGS]

...それは私が欲しいものです。ただし、スクリプト自体を実行可能にすると、上記のようにリポジトリダウンロードの問題が発生します。また、スクリプトが実行可能でない場合はいつでも、追加 - と a を使用してpython呼び出す必要がありますwhich(そうでない場合は、python現在のディレクトリでファイルを探します)。

python `which myscript.py` [ARGS]

…まだタイピングが多すぎて気に入らない。また、ファイルが実行できない場合は。my[TAB]中にあっても/usr/binタブ補完機能は動作しません。動作しますwhich

myscript.pyさて、おおよそ言えば、シンボリックリンクに対して別々の実行権限を持つことができれば、元の実行不可能な権限を維持しながらもコマンドラインから直接実行できることを願っています。 Mac OSXで可能かどうかはわかりませんが、ファイル権限はシンボリックリンクにどのように適用されますか? - ルートLinuxは、シンボリックリンク自体の権限ではなく、元のファイル権限のみを考慮するオプションをまったく提供していません。

だから私は知りたいです:

  • これを達成するために、他の種類のリンク(おそらく「ハードリンク」?)を使用できますか?
  • 基本的にシンボリックリンクに似たものを作成できますが、独自の権限セットを除いてソースコードと同じコピーを作成できるドライバやソフトウェアの種類はありますか?

答え1

シンボリックリンクが機能しません。どちらのファイルも同じ権限を持つため、ハードリンク(可能な場合)も機能しません。しかし、私は次のようにしようとしています。/usr/bin/myscript.pyスクリプトをリンクするのではなく、スクリプト自体を実行するシェルスクリプトを作成します。

#!/bin/sh
exec python /path/to/wherever/I/have/put/myscript.py "$@"

引数を渡します"$@"。スクリプトが引数を受け入れない場合は、このセクションを安全に削除できます。

答え2

シンボリックリンクはターゲットの権限に影響を与えず、カーネルが自動的に従うパスを保存する方法にすぎません。実際、多くのシステムはシンボリックリンクに対する権限を完全に無視します。

ハードリンクは、ファイルシステム内の複数の場所に同じファイル(同じコンテンツ、同じメタデータ(権限を含む))を保持する方法なので、役に立ちません。

あなたはそれを使用することができますファイルシステムバインディングファイルが異なる権限を持つファイルシステムの代替ビューを作成します。

bindfs --perms=a+x /path/to/wherever/I/have/put ~/bin/wherever

これにより、代替ビューのすべてのファイルが実行可能になります。これはあなたの状況では便利な方法ではないかもしれませんが、同様の問題を抱えている他の人にとっては便利です。

実際の解決策は、ダウンロードシステムがファイルを実行可能にすることができるという仮定の下で権限を気にしないようにストレージシステムを変更することです。失敗した場合は、ダウンロード後にファイルの権限を変更するだけです。

#!/bin/sh
actual-download-command
chmod +x /path/to/wherever/I/have/put/*.py

関連情報