2017-08-29 31 views
0

我使用我的LDAP用户名登录多台Linux主机,然后使用sudo su登录到ROOT和ORACLE用户并检查数据库状态。因为我在很多Linux主机上每天都这样做,所以我很好奇我是否可以在单个命令行中运行所有命令? 我尝试以下,但它并没有帮助 how to execute multiple commands after sudo command在登录Linux主机时运行多个命令

例子:我登录使用我的LDAP用户Linux主机后 ,我想在一个命令

sudo su - root -c "su - oracle; ps -ef |grep pmon; crsctl stat res -t "

运行以下命令登录到root后,需要切换到oracle用户,然后运行命令

回答

0

您的命令写入的原因不起作用的原因是因为您实际上没有运行您的监视命令oracle用户。

你给第一su调用,su - oracle; ps -ef | grep pmon; crsctl stat res -t的命令,试图做序列的三件事为root:首先,它调用su产卵的交互式shell作为oracle;在此shell退出后,它将运行ps管道;最后,它运行crsctl命令。由于监控命令在之后运行第二个su已完成,因此它们以root运行,这不是您想要的。

你的指挥最小的变化,这将使它的工作如下:

sudo su - root -c "su - oracle -c \"ps -ef | grep pmon; crsctl stat res -t\"" 

(请注意,你需要躲避内对引号的反斜杠,使他们不结束外引用)但是,您可以显着简化此命令:您可以进行的第一个优化是摆脱第一个su调用。你不需要它,因为你从sudo是已经root

sudo su - oracle -c "ps -ef | grep pmon; crsctl stat res -t" 

你仍然可以做的更好,虽然。如果sudo被配置为允许您切换到任何用户(而不仅仅是root),则根本不需要使用su。相反,只是指定要使用sudo -u用户:

sudo -u oracle sh -c "ps -ef | grep pmon; crsctl stat res -t" 

(请注意,您需要显式调用添加到sh这样就可以运行整个命令集的如oracle,而不仅仅是第一个sudo的文档声称,你可以用它-i-s选项这一点,但作为记录在我的测试中,他们没有工作。)

如果你想保持交互的shell作为oracle用户该命令后,你可以简单地使最后的命令sudo运行成为交互式shell。在这种情况下,你可能也想通过-isudo使交互shell有oracle登录环境:

sudo -i -u oracle sh -c "ps -ef | grep pmon; crsctl stat res -t; $SHELL" 
+0

感谢您的建议。 1。以root身份登录的主要原因是以root身份和oracle身份运行命令,而不从ldap中再次提示密码。因此,我宁愿先以root身份登录,然后切换到Oracle。 2.上述2个命令以oracle身份运行'crsctl'和'ps'命令,但我仍保留在我的ldap帐户中。不过,我希望先以root身份登录,然后再以oracle身份登录,并以oracle用户身份运行这些命令。你能帮忙吗? – CoolChap007

+0

你试过我给的命令吗?除了最初的'sudo'之外,他们都不需要任何密码,就像你原来的命令一样。我不确定我是否理解你的第二点:你的意思是说你想在两个命令运行后保留一个交互式shell作为'oracle'? –

+0

是的。它不要求密码,但它仍然保留在我的ldap会话中,不会登录到root - > oracle会话。 是的,我想登录到oracle并保留在oracle会话中运行交互式命令... 我不想简单地运行我的LDAP用户的所有命令...我想以root登录 - > oracle到保持为oracle用户 – CoolChap007