我每天使用LDAP用户名登录多个Linux主机,然后sudo su
登录到ROOT和ORACLE用户并检查数据库状态。
正如我每天在许多Linux主机上做的那样,我很想知道是否可以在单个命令行中运行所有命令? 我试过跟随,但没有帮助 how to execute multiple commands after sudo command
实施例: 在我使用LDAP用户登录Linux主机后,我想在一个命令中运行以下命令
sudo su - root -c "su - oracle; ps -ef |grep pmon; crsctl stat res -t "
登录root后,需要切换到oracle用户,然后运行命令
答案 0 :(得分: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
电话。你不需要它,因为你已root
来自sudo
:
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
&#39 ; s文档声称您可以使用其-i
或-s
选项,但它们并没有像我的测试中记录的那样工作。)
如果要在此命令之后将交互式shell保留为oracle
用户,则只需使最后一个命令sudo
运行为交互式shell。在这种情况下,您可能还希望将-i
传递给sudo
,以便交互式shell具有oracle
的登录环境:
sudo -i -u oracle sh -c "ps -ef | grep pmon; crsctl stat res -t; $SHELL"