高级语言python调用shelll,如何获取shell的所有输

博客访问: 1466731
博文数量: 285
博客积分: 10141
博客等级: 上将
技术积分: 2951
注册时间:
(1) Python //前面的文章中已经提到过了http://blog.chinaunix.net/u/12325/showart_217175.html两种方法,一种是且Popen.
output = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE,shell=True).communicate()print output[0]
另外一种则可返回状态与调用的shell命令的输出结果>>> import commands>>> status, output = commands.getstatusoutput('ls -l')
(2) Perl //这个相比之下就简单多了$out=`shell command`(3) Shell最简单的方法是这样:&&& out=`shell command`或者&&& out=$(shell command)不过要注意的是,如果shell command的输出结果为多行,而这样放进变量中的时候,默认的echo $out是不输出换行的(参看IFS相关的文档),echo "$out"就可以了。(4) C&&&& #include &&&& int system(const char *string);当调用system("command");的时候,执行结果是打在标准输出的。
阅读(7099) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~
Windows也需要支持C99,那么system这个函数的实现肯定不是用vfork的。
哦,那是我对system的理解有问题。。。不过你说考虑一下windows平台是什么意思?
另外,POSIX.1-2001定义有popen。再者system不一定用vfork来实现,这个函数是C89, C99, POSIX.1-2001定义的,考虑一下windows平台结论就出来了。
请登录后评论。 上传我的文档
 上传文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
linux中 如何在程序中获取shell命令运行结果
下载积分:1500
内容提示:linux中 如何在程序中获取shell命令运行结果
文档格式:DOC|
浏览次数:314|
上传日期: 22:23:40|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1500 积分
下载此文档
该用户还上传了这些文档
linux中 如何在程序中获取shell命令运行结果
关注微信公众号C程序调用shell脚本共有三种法子 :system()、popen()、exec系列函数call_exec1.c&,内容为:system() 不用你自己去产生进程,它已经封装了,直接加入自己的命令exec 需要你自己 fork 进程,然后exec 自己的命令popen() 也可以实现执行你的命令,比system 开销小1)system(shell命令或shell脚本路径);&&&&&&system() 会调用fork()产生 子历程,由子历程来调用/bin/sh-c string来履行 参数string字符串所代表的命令,此命令履行 完后随即返回原调用的历程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被漠视 。&&&&&&&返 回值:如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。 如果 system()调用成功 则最后会返回履行 shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因 此最好能再反省 errno 来确认履行 成功 。&&&&system命令以其简略 高效的作用得到很很广泛 的利用 ,下面是一个例子例:在/tmp/testDir/目录下有shell脚本tsh.sh,内容为#!/bin/shwget&$1echo&"Done!"在同层目录下新建一个c文件(以下代码 可带参数)#include&&stdio.h&#include&&string.h&#include&unistd.h&&&int&main(int&argc&,char&*argv[]){&&&&char&arg[300]="/tmp/testDir/tsh.sh&";&&&&if&(&argv[1]&!=&NULL&)&&&&{&&&&&&&&strcat(arg,argv[1]);&&&&&&&&&&&&&&&&system(arg);&&&&&&&&printf("\ndone&message&in&program\n");&&&&&&&&return&1;&&&&}&&&&else&&&&{&&&&&&&&printf("Error:&Empty&input\n");&&&&&&&&return&0;&&&&}&&&&}&&&履行 效果 如下:&运行输出[root@localhost&testDir]#gcc&call_exec1.c&-o&call_exec1[root@localhost&testDir]#./call_exec1&http://www.baidu.com/img/logo-yy.gif--2011-01-21&17:02:22--&&http://www.baidu.com/img/logo-yy.gif正在解析主机&www.baidu.com...&61.135.169.105,&61.135.169.125Connecting&to&www.baidu.com|61.135.169.105|:80...&已连接。已发出&HTTP&请求,正在等待回应...&200&OK长度:1618&(1.6K)&[image/gif]Saving&to:&`logo-yy.gif'100%[======================================&]&1,618&&&&&&&--.-K/s&&&in&0.001s&&2011-01-21&17:02:34&(3.05&MB/s)&-&`logo-yy.gif'&saved&[]Done!done&message&in&program2)popen(char *command,char *type)&&&&&&&&popen() 会调用fork()产生 子历程,然后从子历程中调用/bin/sh -c来履行 参数command的指令。参数type可应用 “r”代表读取,“w”代表写入。遵循此type值,popen()会建立 管道连到子历程的标准 输出设备 或标准 输入设备 ,然后返回一个文件指针。随后历程便可利用 此文件指针来读取子历程的输出设备 或是写入到子历程的标准 输入设备 中。此外,所有应用 文 件指针(FILE*)操作的函数也都可以应用 ,除了fclose()以外。&&&&&返回值:若成功 则返回文件指针,否则返回NULL,差错 原因存于errno中。注意:在编写具SUID/SGID权限的程序时请尽量避免应用 popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。&例:C程序popentest.c内容如下:&& &#include&stdio.h&&&&&main&&&&{&&&&&&&&FILE&*&&&&&&&&&charbuffer[80];&&&&&&&&fp=popen(“~/myprogram/test.sh”,”r”);&&&&&&&&fgets(buffer,sizeof(buffer),fp);&&&&&&&&printf(“%s”,buffer);&&&&&&&&pclose(fp);&&&&}&&履行 效果 如下:&运行输出&#include&stdio.h&&&&&main&&&&{&&&&&&&&FILE&*&&&&&&&&&charbuffer[80];&&&&&&&&fp=popen(“~/myprogram/test.sh”,”r”);&&&&&&&&fgets(buffer,sizeof(buffer),fp);&&&&&&&&printf(“%s”,buffer);&&&&&&&&pclose(fp);&&&&}from : http://blog.163.com/redhatroot@126/blog/static/8/& 作部分修改
阅读(...) 评论()C程序调用shell脚本共有三种方式:system()、popen()、exec系列函数
1)system(shell命令或shell脚本路径);
执行过程:system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
返回值:如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果 system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno
来确认执行成功。
注意:在编写具有SUID/SGID权限的程序时最好不要使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。例:在~/myprogram/目录下有shell脚本test.sh,内容为#!bin/bash#test.shecho $HOME在该目录下新建一个c文件systemtest.c,内容为:#include/*This program is used to test function system*/main(){
system("~/myprogram/test.sh");}执行结果如下:xiakeyou@ubuntu:~/myprogram$ gcc systemtest.c -o systemtestxiakeyou@ubuntu:~/myprogram$ ./systemtest /home/d/e/xiakeyouxiakeyou@ubuntu:~/myprogram$2)popen(char *command,char *type)
执行过程:popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。
返回值:若成功则返回文件指针,否则返回NULL,错误原因存于errno中。
注意:在编写具SUID/SGID权限的程序时请尽量避免使用popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。例:C程序popentest.c内容如下:
charbuffer[80];
fp=popen(“~/myprogram/test.sh”,”r”);
fgets(buffer,sizeof(buffer),fp);
printf(“%s”,buffer);
pclose(fp);
}执行结果如下:xiakeyou@ubuntu:~/myprogram$ vim popentest.cxiakeyou@ubuntu:~/myprogram$ gcc popentest.c -o popentestxiakeyou@ubuntu:~/myprogram$ ./popentest/home/d/e/xiakeyou
popen函数执行命令后,返回一个指向该命令输出的文件句柄,接下来就可以用fgets等文件操作函数去读取输出结果。
type的参数只能是“r”或"w"
int main(int argc,char*argv[]){
FILE *fstream=NULL;
char buff[1024];
memset(buff,0,sizeof(buff));
if(NULL==(fstream=popen("ls -l","r")))
fprintf(stderr,"execute command failed: %s",strerror(errno));
return -1;
if(NULL!=fgets(buff, sizeof(buff), fstream))
printf("%s",buff);
pclose(fstream);
return -1;
pclose(fstream);
linux exec的用法说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是:#include extern char **int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ..., char *const envp[]);int execv(const char *path, char *const argv[]);int execvp(const char *file, char *const argv[]);int execve(const char *path, char *const argv[], char *const envp[]); 其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。与一般情况不同,exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程ID等一些表面上的信息仍保持原样,颇有些神似"三十六计"中的"金蝉脱壳"。看上去还是旧的躯壳,却已经注入了新的灵魂。只有调用失败了,它们才会返回一个-1,从原程序的调用点接着往下执行。 现在我们应该明白了,Linux下是如何执行新程序的,每当有进程认为自己不能为系统和拥护做出任何贡献了,他就可以发挥最后一点余热,调用任何一个exec,让自己以新的面貌重生;或者,更普遍的情况是,如果一个进程想执行另一个程序,它就可以fork出一个新进程,然后调用任何一个exec,这样看起来就好像通过执行应用程序而产生了一个新进程一样。事实上第二种情况被应用得如此普遍,以至于Linux专门为其作了优化,我们已经知道,fork会将调用进程的所有内容原封不动的拷贝到新产生的子进程中去,这些拷贝的动作很消耗时间,而如果fork完之后我们马上就调用exec,这些辛辛苦苦拷贝来的东西又会被立刻抹掉,这看起来非常不划算,于是人们设计了一种"写时拷贝(copy-on-write)"技术,使得fork结束后并不立刻复制父进程的内容,而是到了真正实用的时候才复制,这样如果下一条语句是exec,它就不会白白作无用功了,也就提高了效率。返回值如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。大家在平时的编程中,如果用到了exec函数族,一定记得要加错误判断语句。因为与其他系统调用比起来,exec很容易受伤,被执行文件的位置,权限等很多因素都能导致该调用的失败。最常见的错误是:1.找不到文件或路径,此时errno被设置为ENOENT; 2.数组argv和envp忘记用NULL结束,此时errno被设置为EFAULT; 3.没有对要执行文件的运行权限,此时errno被设置为EACCES。l表示以参数列表的形式调用v表示以参数数组的方式调用e表示可传递环境变量p表示PATH中搜索执行的文件,如果给出的不是绝对路径就会去PATH搜索相应名字的文件,如PATH没有设置,则会默认在/bin,/usr/bin下搜索。另:调用时参数必须以NULL结束。原进程打开的文件描述符是不会在exec中关闭的,除非用fcntl设置它们的“执行时关闭标志(close on exec)”而原进程打开的目录流都将在新进程中关闭。例子:#include int main(int argc, char *argv[]){char *envp[]={"PATH=/tmp", "USER=lei", "STATUS=testing", NULL};char *argv_execv[]={"echo", "excuted by execv", NULL};char *argv_execvp[]={"echo", "executed by execvp", NULL};char *argv_execve[]={"env", NULL};if(fork()==0) {if(execl("/bin/echo", "echo", "executed by execl", NULL)&0)perror("Err on execl");}if(fork()==0) {if(execlp("echo", "echo", "executed by execlp", NULL)&0)perror("Err on execlp");}if(fork()==0) {if(execle("/usr/bin/env", "env", NULL, envp)&0)perror("Err on execle");}if(fork()==0) {if(execv("/bin/echo", argv_execv)&0)perror("Err on execv");}if(fork()==0) {if(execvp("echo", argv_execvp)&0)perror("Err on execvp");}
if(fork()==0) {
if(execve("/usr/bin/env", argv_execve, envp)&0)
perror("Err on execve");
fork 和 vfork 使用的注意事项和 system() 函数的替代
linux C 中调用新的进程 (system和execv)
C语言中的popen()函数
在C语言中调用shell命令的实现方法
PHP 调用系统外部命令 system() exec() passthru() 和 popen()
如何获取system函数执行的结果------用popen搞起(很有用)
C语言调用SHELL脚本
C语言调用shell命令方法
没有更多推荐了,博客分类:
使用到Process和Runtime两个类,返回值通过Process类的getInputStream()方法获取
import java.io.BufferedR
import java.io.IOE
import java.io.InputStreamR
import java.util.ArrayL
import java.util.L
public class ReadCmdLine {
public static void main(String args[]) {
Process process =
List&String& processList = new ArrayList&String&();
process = Runtime.getRuntime().exec("ps -aux");
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
while ((line = input.readLine()) != null) {
processList.add(line);
input.close();
} catch (IOException e) {
e.printStackTrace();
for (String line : processList) {
System.out.println(line);
调用shell脚本,判断是否正常执行,如果正常结束,Process的waitFor()方法返回0
public static void callShell(String shellString) {
Process process = Runtime.getRuntime().exec(shellString);
int exitValue = process.waitFor();
if (0 != exitValue) {
log.error("call shell failed. error code is :" + exitValue);
} catch (Throwable e) {
log.error("call shell failed. " + e);
浏览: 3289 次
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 shell脚本从入门到精通 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信