从c程序在远程主机上执行命令

时间:2013-05-14 21:09:41

标签: c linux ssh

我正在尝试自动执行登录防火墙服务器的过程,导出一些日志,将日志scp到本地主机,然后将其从远程服务器(防火墙服务器)中删除

我还启用了基于主机的身份验证,这样两台计算机就可以进行通信,而无需在ssh-ing和转移过程中输入任何一台计算机的密码。

我开始使用系统调用认为它可以工作,但似乎它没有按预期工作。我做的是这样的事情

system(ssh user@firewallserver)
system(cd /directory)
system(fwm logexport)
system(scp log user@localhost:/home)
system(rm log)
过去尝试过此操作的人会知道这不起作用,但我不知道解决方案,也可能是完成任务的不同方法。

谢谢!

3 个答案:

答案 0 :(得分:2)

每个system命令都会打开新进程,以便您的ssh会话在第二次调用中消失。如果您真的想使用system

,请尝试在一个命令中执行此操作

ssh server <some commands on server side>

scp <path on server> <local path>

编辑: 尝试

ssh server 'cd /directory && touch test123'

命令行上的

。这应该在目录test123中的远程服务器上创建文件/directory。然后将此命令放入system(...)电话中。通过这种方式,您可以在远程主机上执行命令。对于每次新system来电,您必须再次ssh server <commands> ...

如果在C程序中不需要它,可以将这些命令直接放在bash脚本中:

#!/bin/bash
ssh server 'cd /directory && touch test123'
scp server:/directory/test123 /home/me/log123

答案 1 :(得分:0)

Bash肯定是要走的路!您可以直接将这些命令粘贴到脚本中,如果您已正确设置身份验证,它应该可以正常工作。

脚本看起来像这样:

#!/bin/bash
ssh user@firewallserver
cd /directory
fwm logexport
scp log user@localhost:/home #Possible mistake
rm log

现在我查看了你的代码,可能会有一个误解。我认为您应该将log移回ssh - 来自firewallserver的原始计算机。

如果是这种情况,则无法在localhost来电中使用scp,因为那是firewallserver。您需要scp log user@<your local IP>才能将日志恢复为您登录的计算机。

也许我误解了,如果是这样的话,我上面发布的剧本应该有效。但是,如果我是正确的,那么只需交换scp行即可。

答案 2 :(得分:0)

这是如何有效地完成的,在bash脚本中执行以下操作

#!/bin/bash
ssh user@host 'bash -l' < ~/dowork.sh

“dowork.sh”脚本是您要在远程计算机上执行的脚本,您必须将这些脚本分解为两个脚本并在执行命令时将dowork.sh重定向到ssh

验证你有一个shell进入正确的机器在“dowork.sh”中执行此操作

#!/bin/bash
echo $PATH

这将为您提供远程计算机的路径变量。