【问题标题】:Run multiple ssh commands using execl使用 execl 运行多个 ssh 命令
【发布时间】:2013-10-25 19:11:31
【问题描述】:

我想从我的 C 程序中执行以下命令:

ssh -t -t root@192.168.3.21 "export LINES=40;export COLUMNS=124;export TERM=xterm;$SHELL -i" 0 t_out

如果我使用系统调用如下:

system("ssh -t -t root@192.168.3.21 \"export LINES=40;export COLUMNS=124;export TERM=xterm;$SHELL -i\" 0<t_in 1>t_out");

效果很好。但是我需要获取SSH进程的PID,所以必须使用execlp。

到目前为止我尝试的是:

  pid = fork();
  if(pid == 0) {
     fd_in = open("td_in", O_RDWR | O_NONBLOCK);
     dup2(fd_in, 0);
     close(fd_in);
     fd_out = open("td_out", O_RDWR | O_NONBLOCK);
     dup2(fd_out, 1);
     close(fd_out);
     execlp("ssh", "ssh", "-t", "-t", "root@192.168.3.21", "\"export LINES=40;export COLUMNS=124;export TERM=xterm;$SHELL -i\"", 0); 
  } else {
     // not important here
  }

运行此程序时,它进入 SSH 登录,输入密码后出现错误:

bash:export LINES=40;export COLUMNS=124;export TERM=xterm;/bin/bash -i: 没有这样的文件或目录。 与 192.168.3.21 的连接已关闭。

t_in 和 t_out 是一些 fifo(命名管道)

我的问题是执行上述命令的正确 execlp 调用应该是什么。 谢谢

【问题讨论】:

    标签: c linux ssh exec fork


    【解决方案1】:

    您可以尝试删除 ssh 命令参数中的转义双引号。

    execlp("ssh", "ssh", "-t", "-t", "root@192.168.3.21", "export LINES=40;export COLUMNS=124;export TERM=xterm;$SHELL -i", 0); 
    

    'system' 版本需要它们,因为该行由 shell 处理,但在 'execcp' 版本中并非如此。

    【讨论】:

    • 没错,我已经找到了。我想回答,但我不得不等待 8 小时。谢谢
    最近更新 更多