を使用して動作するリモートスクリプトがありますssh user@host "bash /path/to/remote/script.sh"
。
私はこのスクリプトがリモートシェルで直接実行されるのではなく、SSHを介してローカルで実行されている場合にのみ実行したいと思います。同様の値をスクリプトに渡し、スクリプトでssh user@host "bash /path/to/remote/script.sh local"
ない$1
場合は終了することを検討しましたが、local
これをテストするためのより信頼性の高い方法はありますか?
本当にありがとう、スティーブ。
ベストアンサー1
スクリプトの親プロセスpidのプロセス名が一致していることを確認できますsshd
。
たとえば、スクリプトの最初の部分(この#!
行のすぐ後ろが良い場所)です。
#!/bin/bash
if [ "$(ps h -o comm -p "$PPID")" != "sshd" ] ; then
echo "This script can only be run directly from ssh." > /dev/stderr
exit 1
fi
これはbashの組み込みの読み取り専用変数「$ PPID」を使用します。これはbashのすべてのインスタンスで自動的に定義されます。
スクリプトへの読み取りアクセス権を持つ人は誰でもその行をコピーして削除できるので、これは意味がありません。これは、スクリプトがこれを実行するために使用する方法に関係なく適用されます。
さらに、プロセス名は簡単に偽造されます。sshd
スクリプトを実行する前にプロセス名をに設定するラッパースクリプトを作成するのは簡単です。
他のユーザーがスクリプトを実行できるという懸念がある場合は、スクリプトの権限設定を検討しましたか?ただスクリプト所有者はスクリプトを読み取ったり実行したりできますか? (例えばchmod 700 /path/to/script
)