切り替えずに特定のユーザーでコマンドを実行する方法(su)

切り替えずに特定のユーザーでコマンドを実行する方法(su)

LDAPユーザー「exp」からユーザー「oracle」に特定のコマンドセットを実行したいと思います。

たとえば、

exp@linuxtest -]$ sudo -u oracle \"export ORACLE_HOME=/u01/app/oracle;echo $ORACLE_HOME;export PATH=$PATH:$ORACLE_HOME/bin;$ORACLE_HOME/bin/exp full=y

上記のコマンドを試しましたが、次のエラーが発生しました。

usage: sudo [-D level] -h | -K | -k | -V
usage: sudo -v [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid]
usage: sudo -l[l] [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-U user name] [-u user name|#uid] [-g groupname|#gid] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid] [-g groupname|#gid] [VAR=value] [-i|-s] [<command>]

最後に、oracleユーザーに切り替えずに「oracle」ユーザーとして次のコマンドを実行したいと思います。 oracleユーザーに切り替えるにはパスワードが必要なため、このパスワードを使用すると、「exp」ユーザーに「oracle」ユーザーへのフルアクセス権が付与されます。

sudo su - oracle -c \"export ORAENV_ASK=NO;export ORACLE_SID=`ps -ef |grep pmon |grep -v grep | grep pmon | grep -v asm| grep -v APX | awk -F_ '{print $3}'`;export ORACLE_HOME="`cat /etc/oratab |grep dbhome | awk -F: '{print $2}' |sort  -u |sed -e /^$/d`";export ORACLE_SID=`ps -ef |grep pmon |grep -v grep | grep pmon | grep -v asm| grep -v APX | awk -F_ '{print $3}'`;export PATH=$PATH:"`cat /etc/oratab |grep dbhome | awk -F: '{print $2}' |sort  -u |sed -e /^$/d`"/bin:"`cat /etc/oratab |grep dbhome | awk -F: '{print $2}' |sort  -u |sed -e /^$/d`"/OPatch;"/u01/app/oracle/product/12.1.0/dbhome_1/bin/expdp  \"sys/oracle as sysdba\" DIRECTORY=DATAPUMP_DIR dumpfile=FULL_DB.dmp FULL=Y LOGFILE=full_exp.log"\"

答え1

あなたは地獄を引用しました。以下を試してください。 sudoを使用してシェルを起動し、ここのドキュメントにあるシェルコマンドを提供します。実際に読むことができるこのバージョンは次のとおりです。

sudo -u oracle -c sh <<'END_SH'
    export ORAENV_ASK=NO
    export ORACLE_SID=$(pgrep -fl pmon | grep -Eiv 'asm$|apx$' | cut -d_ -f3)
    export ORACLE_HOME=$(awk -F: '/dbhome/ {print $2}' /etc/oratab |sort  -u)
    export PATH="$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/OPatch"

    "$ORACLE_HOME"/bin/expdp  "sys/oracle as sysdba" DIRECTORY=DATAPUMP_DIR dumpfile=FULL_DB.dmp FULL=Y LOGFILE=full_exp.log
END_SH

grep|grep|awk パイプラインを大幅に簡素化しました。 ORACLE_HOMEを次のように設定する理由はわかりません。 / etc / oratabにそのエントリが複数回表示されるとsort予想していますか?dbhome

関連情報