1

状況は次のとおりです。

CYGWIN で RSYNC コマンドを使用して Web サイトを展開する SH 展開スクリプトを作成しています。インストール後、開発チームに電子メールを送信して、展開が詳細に行われたことを伝えたいと考えています。CYGWINからのメール送信には「exim」を使用します。

問題は、exim は CYGWIN のインストール時にのみオプションであり、インストールされていない場合は SH スクリプトを終了したいということです。アプリがスクリプトにインストールされている場合、UNIX (および CYGWIN で作業) をチェックするアイデアはありますか?

前もって感謝します !

4

4 に答える 4

4
# bash script (should also work with sh)
# someprog must be on the path for type to find it
if type -p "someprog"
then
    echo "it's there"
else
    echo "it isn't"
fi
于 2009-07-24T09:19:37.363 に答える
2

特に「exim」を確認するには、実行します

exim -bV

私のCygwinでは、次のような出力が得られます

Exim version 4.69 #1 built 28-Jan-2008 21:59:08
Copyright (c) University of Cambridge 2006
Probably GDBM (native mode)
Support for: crypteq iconv() PAM OpenSSL Content_Scanning
Lookups: lsearch wildlsearch nwildlsearch iplsearch dbm dbmnz dnsdb dsearch ldap
    ldapdn ldapm passwd
Authenticators: cram_md5 plaintext spa
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply pipe smtp
Size of off_t: 8
Configuration file is /etc/exim.conf

「exim -bV」の「exim」マニュアルから、

このオプションにより、Exim は現在のバージョン番号、コンパイル番号、および exim バイナリのコンパイル日付を標準出力に書き込みます。また、これが使用されている DBM ライブラリ、オプションのモジュール (特定のルックアップ タイプなど)、バイナリに含まれるドライバー、および使用中のランタイム構成ファイルの名前もリストします。

-bV は、操作の一部として、Exim に構成ファイルを読み取らせ、構文をチェックさせます。ただし、これは静的チェックのみです。展開する値をチェックすることはできません。たとえば、ACL動詞のスペルミスは検出されますが、動詞の引数のエラーは検出されません。-bV だけに頼って (たとえば) 構成内のすべてのタイプミスを発見することはできません。いくつかの現実的なテストが必要です。-bh および -N オプションは、より動的なテスト機能を提供します。


typeおよびwhichチェックとの比較。

typeはシェル組み込みコマンドです。コマンドとして使用された場合、名前がシェルによってどのように解釈されるかを示します。この-pオプションにより、コマンドが発行された場合に実行されるディスク ファイルの名前が返されます。

PATH同じbashアルゴリズムを使用した検索で、指定された名前で実行可能ファイルを検索するだけです。

誰かが同じ名前で呼び出された実行可能ファイルをパスに配置すると、これらのいずれかが true を返します。セキュリティが懸念される場合は、スクリプトからのコマンドの呼び出しについてより注意する必要があります。

何を実行しているかを知ることは賢明かもしれません。
もちろん、exim上の入力を返すというシェル スクリプトを実装することもでき-bVます。バックグラウンドでめちゃくちゃなこと - あなたのパラノイアのレベルは何ですか?

于 2009-07-24T09:28:20.463 に答える
0

nikが提起したセキュリティ上の懸念を軽減するために、実行可能ファイルの場所を予想される場所のリストと照合することができます。

case $(type -p someprog) in

    /usr/bin/someprog \
    | /bin/someprog \
    | /usr/local/someprog)

        echo "Valid location";; 
    *)
        echo "Invalid location";;
esac
于 2009-07-24T11:21:47.927 に答える
0

「which」コマンドを使用できます。プログラムの場所が返されるか、存在しない場合は何も返されません。

于 2009-07-24T09:26:23.417 に答える