Linux:用ssh来托pipe和使用sudo来运行一个脚本,运行但脚本部分失败

我已经search了高和低的答案。 我有密钥设置,所以没有密码是需要的SSH到远程主机。 我有sudo设置与该用户,以便我可以运行所需的命令作为root用户没有密码。 我只用ssh来执行几天的远程命令(这是一个多么辉煌的发现!)。

一点背景:在远程主机上运行的脚本是一个典型的程序启动/停止脚本。 在实际程序的某处,打开一个日志文件进行写入。 在远程主机上,如果以root用户身份运行脚本,一切正常。 如果我作为用户运行它,我得到一个错误: log4cplus:ERROR Unable to open file: appname.log 。 有道理,因为日志属于root。

现在,情况:我的本地主机上有一个脚本,它将SSH入远程主机,并使用sudo将运行该脚本。 脚本能够运行。 但是,启动后,我得到了与上面有关日志文件相同的错误。 我已经尝试了以下,这些都成功地运行脚本,但得到错误。 我知道有些是没有必要的,但是我想涵盖所有我能find的基础(我也尝试过-t,但是没有区别,我不认为会有,但是…):

 /usr/bin/ssh username@remotehost sh -c sudo "/etc/rc3.d/S99script start" /usr/bin/ssh username@remotehost sh -c sudo "/etc/rc3.d/S99script start" /usr/bin/ssh username@remotehost 'sh -c sudo "/etc/rc3.d/S99script start"' /usr/bin/ssh username@remotehost sudo /etc/rc3.d/S99script start /usr/bin/ssh username@remotehost "sudo /etc/rc3.d/S99script start" /usr/bin/ssh username@remotehost sudo "/etc/rc3.d/S99script start" /usr/bin/ssh username@remotehost 'sudo "/etc/rc3.d/S99script start"' /usr/bin/ssh username@remotehost sudo su - -c "/etc/rc3.d/S99script start" /usr/bin/ssh username@remotehost 'sudo su - -c "/etc/rc3.d/S99script start"' 

我知道还有其他的东西我尝试过,但是我没有把它们都logging下来。 不要嘲笑我尝试所有不同的引号,我对于什么时候使用哪种方法有一个很好的理解,但是我在尝试不同的事情时没有做任何改变:)

运行这些东西时我注意到的是,如果我为脚本名称执行ps -ef | grep,它将显示以下内容:

 [username's UID] 3070 3069 0 14:42 ? 00:00:00 bash -c /etc/rc3.d/S99script start 

那甚至是我做“sh -c sudo”的那个。 它运行为bash -c的事实是有趣的,但也有趣(我想?)是它具有用户的UID而不是列出的用户名。

**添加:我也尝试在“用户名”的主目录下创build一个脚本: sudo /etc/rc3.d/S99script start然后我得到相同的结果。

首先,更改您的基于密钥的身份validation,以便您login到远程系统的用户是有问题的用户 – 那么不需要使用sudo(因为您已经指出该服务没有以root身份运行,应该没有安全性与基于密钥的自动login有关)。

其次,看一下sshd_config(5)中的ForceCommand – 如果你正在使用一个只能做一件事情的服务账号,这将提供额外的安全性。 请注意对Match指令的引用。

最后,当执行也涉及修改系统上的文件的命令时,sudo可能会有意想不到的结果 – 这就是为什么诸如“sudo echo foobar >> / etc / passwd”不能按照你认为的方式工作的原因。 这很可能(虽然我不能确定没有看到实际的脚本)是你目前情况的一个因素。 按照我上面的第一个build议,你会完全绕过这个问题。 🙂

你让这个太复杂了。 ssh -t user@host sudo /path/to/command应该是你所需要做的(没有时髦的引用,转义,运行su和子shell – 就像你在远端input命令一样正在手动运行)。
如果你开始使用更复杂的命令,你可能需要引用和转义,但是对于这样简单的事情来说,这是不必要的。

请注意,如果您需要为sudoinput密码,那么SSH的-t标志是必需的:默认情况下,SSH不会为远程命令会话分配tty(sudo会怨恨不能获取您的密码)。 -t强制terminal被分配,所以sudo有一些东西可以互动。
在你的情况下可能不需要,但真的不会伤害任何东西。