0

私は bash スクリプトにまったく慣れていないので、いくつかのことを実行できる小さな bash ファイルに取り組んでいます。まず、system() を使用して C 関数からこれを呼び出しています。スクリプトが値 (エラーの場合は 1、OK の場合は 0) を返すようにします。これは可能ですか?

int kinit() {
    int err = system("/home/bluemoon/Desktop/GSSExample/kinitScript.sh");
}

次に、Zenity を使用して、ユーザー/パスワードを挿入するためのポップアップ ウィンドウを作成することができました。さて、ユーザーの行動に応じて、複数のことが起こるはずです。ウィンドウを閉じるか「キャンセル」をクリックしても、何も起こらないはずです。彼が「OK」をクリックした場合は、入力を確認する必要があります(空のテキストボックスなど)。

入力が正しいと仮定して、Expect を使用して kinit プログラム (Kerberos に関連するプロンプト) を実行し、ログインします。パスワードが正しい場合、プロンプトは閉じられ、スクリプトは 0 を返します。そうでない場合、プロンプトは「Kinit: user not found」のようなものが表示されます。エラーが発生した場合(ウィンドウを閉じる、キャンセルをクリックする、または資格情報が間違っている)、スクリプトで1を返し、成功すると0を返したいと思いました。

#!/bin/bash
noText=""
ENTRY=`zenity --password --username`
case $? in
         0)
        USER=`echo $ENTRY | cut -d'|' -f1`
        PW=`echo $ENTRY | cut -d'|' -f2`

        if [ "$USER"!="$noText" -a "$PW"!="$noText" ] 
        then
            /usr/bin/expect -c 'spawn kinit '`echo $USER`'; expect "Password for '`echo $USER`':" { send "'`echo $PW`'\r" }; interact'
        fi
        ;;
         1)
                echo "Stop login.";;
        -1)
                echo "An unexpected error has occurred.";;
esac

if が正しく機能していない場合、expect コマンドが常に実行されます。Zenity ウィンドウをキャンセルまたは閉じると、常にケース "0" になります。私も変数を返そうとしましたが、関数内からのみ変数を返すことができると言われていますか?

誰かが私にいくつかの指針を与えることができれば、私はそれを感謝します. デイブ

4

1 に答える 1

1

スクリプトが値を返すようにしたい

もちろん、exit適切な場所で使用してください

終了: 終了 [n]
    シェルを終了します。

    N のステータスでシェルを終了します。N を省略した場合、終了ステータスは
    最後に実行されたコマンドのものです。

if が正しく機能していない場合、expect コマンドが常に実行されます。

if [ "$USER" != "$noText" -a "$PW" != "$noText" ]
#           ^  ^                  ^  ^
#           |  |                  |  |
#           \----- notice spaces ----/
于 2014-04-30T21:52:57.853 に答える