如何使用C程序在命令propmt上传递命令?
我想从我的C程序中传递一些命令,下面是示例程序:如何使用C程序在命令propmt上传递命令?,c,linux,command-prompt,C,Linux,Command Prompt,我想从我的C程序中传递一些命令,下面是示例程序: #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(){ FILE *ssh = popen("ssh user@192.168.170.155", "w"); pid_t pid; pid = fork(); if(!ssh) { fprintf(stderr,
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
FILE *ssh = popen("ssh user@192.168.170.155", "w");
pid_t pid;
pid = fork();
if(!ssh)
{
fprintf(stderr, "Could not open pipe for output.\n");
}
if (pid==0){
fprintf(stdout, "Child process properly created.\n");
fputs("user", ssh);
fputc('\n', ssh); // enter key
_exit(0);
}
fprintf(stdout, "Exit from child process.\n");
pclose(ssh);
return 0 ;
}
我想从示例程序传递密码,而不是从命令提示符传递密码。
谁能告诉我如何用C语言编程实现这一点
SSH仅用于示例。它也可以用于其他场景
谢谢,
Yuvi这是可能的,但需要更多的代码。首先,您需要使用
fork()
而不是system()
加上一个exec*()
调用来用您想要运行的命令替换子进程
有关详细信息,请在此处询问或查看,具体而言,我认为
ssh
命令从其stdin
读取密码,在这种情况下,您需要将密码导入程序,为此,您可以使用。C99/POSIX示例:
#include <stdio.h>
int main()
{
FILE *ssh = popen("ssh user@host", "w");
fputs("p4ssw0rd", ssh);
fputc('\n', ssh); // enter key
pclose(ssh);
}
#包括
int main()
{
FILE*ssh=popen(“sshuser@host“,“w”);
fputs(“p4ssw0rd”,ssh);
fputc('\n',ssh);//输入密钥
pclose(ssh);
}
未经测试。使用
fork
/exec
/dup
等组合,您可能会有更好的运气。使用ssh时,设置ssh密钥非常简单,因此不必添加密码。但是,如果您真的想这样做,那么使用名为expect的api非常容易。我自己也用过,效果很好 如果您的问题是关于ssh
接口的,我建议您在superuser.com.No中询问它与ssshNo无关,也就是说,它不仅仅与ssh有关,我仅以ssh为例。在很多情况下,当您使用系统函数启动任何命令时,它会要求一些参数。他还想“输入密码”(我想),因此这也需要一些文件描述符。我已经更新了代码,但仍然不走运。因为你可以解释更多如何实现它,我不懂C编程。我还尝试了所有的组合fork/exec/dup
的排列,这是我遵循的引用链接,但仍然无法实现。@Yuvi:你不需要fork。如果您在我的回答中运行上面的代码而不使用分叉,会发生什么?它要求输入密码就像简单的system()
调用一样。@Yuvi:好的,我发现SSH检测它的stdin
是连接到终端还是从管道连接的,如果它连接到管道,它就不会从中读取任何数据。如果替换sshuser@host
只需使用cat
,您就会看到文本通过管道传输到cat
命令中,cat
会将文本回显到终端(或者更确切地说,回显到其stdout
)。不幸的是,SSH不能像这样编写脚本,这可以通过使用shell内置来证明,例如echo“password”| SSHuser@host
也不起作用,它仍然要求输入密码。请编辑您的答案以添加有关您提到的api的信息,好吗?
#include <stdio.h>
int main()
{
FILE *ssh = popen("ssh user@host", "w");
fputs("p4ssw0rd", ssh);
fputc('\n', ssh); // enter key
pclose(ssh);
}