2016-12-20 4 views
0

サーバ間でファイルをコピーするスクリプトがあります。私はlsofコマンドを使用して、ファイルが移動される前に書き込まれていないことを確認しています。スクリプトを実行しているユーザーとファイルに書き込んでいるユーザーが違うので、ファイルの所有者にsudoする必要があります。ここでsudoersファイルの該当する行です:sudoコマンドを含むスクリプトでソースを使用する

userA ALL=(userB:userB) NOPASSWD: ALL 

メインスクリプトでは、(ユーザAとして走った)、私はsudoのに呼び出して試してみましたが、その後のlsofコマンドを含む添字:

sudo su - userB -c 'source ./getOpenFiles.sh' 

getOpenFiles.sh

:私も添字を呼び出して試してみました

#!/bin/bash 
lsofResult=$(/usr/sbin/lsof "${sourcePath}") 

:この1行を持っています

#!/bin/bash 
sudo su - banjobs 
lsofResult=$(/usr/sbin/lsof "${sourcePath}")`. 

どちらのソリューションが動作している:210

は、その後の添え字のsudoことの最初の行を持っています。

+0

'sudo su - banjobs'を実行すると、' sudo su'が終了して終了するまで次のコマンドは実行されず、残ったものは 'banjobs'として実行されません。 –

+0

つまり、 'lsofResult'を' banjobs'として評価しません。 –

+0

... 'su -c 'source somescript''を使用すると、' somescript'はそのシバンが何を言っていても 'bash'ではなく' sh'によって実行されます。あなたの 'sh 'が' source'をサポートしていなければ、それはまったく動かない。 (POSIX互換の 'source'を書く方法は' source somescript'ではなく 'somescript'です)。 –

答えて

1

は、あなたが実際にしたいことは何かもっとのようなものです:他のアプローチが機能しなかった理由を

lsofResult=$(sudo -u banjobs lsof "${sourcePath}") 

はのは、上に行こう1つずつ:

  • sudo su -csourceを実行します

    sudo su - userB -c 'source ./getOpenFiles.sh' 
    

    は...を実行するためにsudoを使用しています、sh -c 'source ./getOpenFiles.sh'を実行します。これは、いくつかの独立した理由のために動作しません:

    1. sh -c 'source ./getOpenFiles.sh'/bin/shで利用可能sourceキーワードに頼っているが、これは、bashの拡張機能です。あなたの/bin/shは、bashので提供されていても

    2. 、これはまだsourceを使用しての目的に反し:/bin/shの新しいコピーを開始し、そのにあなたのスクリプトを調達することで、あなたはで変数を定義している新しいシェルで始まった元のシェルsudo suではありません。 lsofResult=$(/usr/sbin/lsof "${sourcePath}")

      続いsudo su - banjobsを、実行

  • ... lsofResult=$(...)sudo su - banjobs終了後まで実行していないことを意味します。 sudo su - banjobsが終了した場合、現在のユーザはbanjobsではなくなりました。したがって、sudoコマンドは、lsofには何の影響も与えません。上、

    # place relevant contents in sourceme.bash 
    # switching from lsof to fuser for this test since OS X lsof does not accept a directory 
    # as an argument. 
    cat >sourceme.bash <<'EOF' 
    lsofResult=$(sudo -u root fuser "${sourcePath}" 2>&1) 
    EOF 
    
    # set sourcePath in the outer shell 
    sourcePath=$PWD 
    source sourceme.bash 
    declare -p lsofResult 
    

    ...利回り:


デモンストレーション、詳細に、どのように(自分のシステム上banoffまたはuserBアカウントを持っていない人々のために)これをテストするには私のシステムは以下のように出力されます:

declare -- lsofResult="/Users/chaduffy/tmp: 17165c 17686c 17687c 17688c 17689c 17690c" 

...問題のコードが実際に働いたことを示しています説明したように。

+0

あなたの答えCharlesに感謝します。残念ながら、あなたのソリューションはまだ動作しませんでした。私は下付き文字とメインスクリプトの両方の中でそれを試しました。 – Stu

+0

@Stu、私は完全に再現する必要があります。*正確に*どのように使用しているかを表示します(呼び出しと収集された値の評価の両方)。これは正しく使用されたときには確かに「うまくいく」 - それを示す質問に例を編集してうれしい。 –

+0

@Stu、...このような例が追加されました。 –

関連する問題