" sudo su&& somecommand"没有运行某个命令

时间:2016-12-21 21:45:55

标签: bash shell jenkins command-line

我今天创建了一个Jenkins工作,它的作用是Jenkins用户应该登录到另一个服务器并运行由&&分隔的两个命令:

ssh -i /creds/jenkins jenkins@servername.com "sh -c 'sudo su && df'"

登录部分工作正常,然后它运行sudo su命令并成为root,但它从不运行第二个命令(即df)。

我甚至手动执行此操作,并从Jenkins计算机登录到其他服务器(servername)。然后运行sh -c "sudo su && df"没有运气。

你能帮忙吗?

提前致谢

4 个答案:

答案 0 :(得分:2)

如果您尝试以root身份运行df命令,则应执行sudo df

这是因为使用sudo su && df,您基本上首先执行sudo su,然后df

另外请确保您的jenkins用户可以在没有密码的情况下使用sudo。

答案 1 :(得分:2)

sudo su启动第二个shell,并且在&& df shell成功退出后,包含sudo su的命令正等待在非root shell中执行。

答案 2 :(得分:1)

这可能是您正在寻找的内容:

sh -c 'sudo su - root -c "df"'

修改:请注意,我通常不会使用或提倡使用sudo su - root -c类型的结构。但是,我发现在通过sudo/gksudo调用时程序无法正常工作的罕见情况,但在通过su/gksu调用时工作正常 - 在这种情况下,给定用户应该< strong>尝试首先使用sudo -i ,如果这不起作用,可能不得不诉诸sudo su - root -c或类似的,作为处理&#34;的一种解决方法。行为不端&#34;程序。由于OP在他的帖子中使用了一些类似的语法,我认为他的案例可能是一个解决方案,所以我在答案中保留了sudo su - root -c类型的结构。

答案 3 :(得分:0)

当您执行sudo su && df时,sudo su将立即启动子进程而无需等待命令的&& df部分执行,当您点击Ctrl + D它退出时子进程并进入父shell,那就是你的&amp;&amp; df会执行。您应该使用此处的字符串执行此操作,它可能不是最佳选项,但它可以工作,并且它不会启动新的子进程

sh -c "sudo su" <<<df

注意:不要围绕&lt;&lt;&lt;带有任何引号的df