标签: exec

是否有可能让'exec'在Perl中使用'$ SHELL -c'而不是'/ bin/sh -c'?

在Perl中,是否有可能使'exec','system'和'qx'使用除/ bin/sh之外的shell(不使用像'exec'这样的构造$ SHELL -c ..."',并且没有重新编译perl)?

编辑:这个问题的动机是一个bash脚本,它执行'export -f foo',然后在子shell中使用perl直接通过'system"foo"'调用函数.我不确定这种技术是否适用于所有sh,虽然'system'/ bin/bash -c foo"'可能在这种情况下有效,但我不希望导出的函数在/ bin /的所有变体中传播SH.但大多数时候我只是好奇,现在对如何将解决方案扩展到qx感到好奇.此外,由于我对非unix平台一无所知,所以我想避免在解决方案中对备用shell的路径进行硬编码.

unix perl exec

3
推荐指数
1
解决办法
894
查看次数

在T-SQL中如何显示给定表名的列?

我试图列出我选择的任何Adventureworks表中的所有列.我可以执行哪些T-sQL语句或存储过程来查看所有列的列表?我想使用我的C#Web应用程序输入一个输入参数= table_name,然后获取所有column_names的列表作为输出.现在我正在尝试执行sp_columns存储过程,但是我不能只使用select和exec组合的一列.有人知道怎么做这个吗?

感谢大家的所有回复,但没有一个答案符合我的要求.让我更多地为您解释我的问题.下面的查询返回我需要的内容.但我的问题是将这个逻辑合并到一个带有输入参数的SP中.所以这是成功的SQL语句:

select col.name from sysobjects obj inner join syscolumns col 
    on obj.id = col.id
    where obj.name = 'AddressType' 
     order by obj.name
Run Code Online (Sandbox Code Playgroud)

目前我的SP看起来像:

CREATE PROCEDURE [dbo].[getColumnNames]
    @TableName VarChar(50)
    AS

    BEGIN
    SET NOCOUNT ON;
    SET @TableName = RTRIM(@TableName)
    DECLARE @cmd AS NVARCHAR(max)
    SET @cmd = N'SELECT col.name from sysobjects obj ' +
    'inner join syscolumns col on obj.id = col.id ' +
    'where obj.name = ' + @TableName
    EXEC sp_executesql @cmd
    END
Run Code Online (Sandbox Code Playgroud)

但我按上述方式运行

exec getColumnNames 'AddressType'
Run Code Online (Sandbox Code Playgroud)

它给了我错误:

Invalid column name …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server exec adventureworks

3
推荐指数
2
解决办法
9208
查看次数

SQL Server 2005:EXEC中的子查询?

EXEC [dbo].[pr_cfgAddFact] 
@SettingName = 'TransferBatch', 
@RoleFK = SELECT TOP 1 rolepk FROM cfgRole WHERE cfgRole.Name = 'SuperAdmin'
Run Code Online (Sandbox Code Playgroud)

为什么SQL会在这里抱怨SELECT子句?我试图用子查询获取数据运行proc.

sql-server stored-procedures sql-server-2005 exec subquery

3
推荐指数
1
解决办法
2640
查看次数

如何知道exec函数中的命令错误?

我正在使用ffmpeg命令在php中使用exec函数剪切视频.但它不是创建视频文件,也不显示任何错误.我用exec如下

exec("ffmpeg -i input.flv -ss 00:00:30.0 -t 00:00:10.0 -acodec copy -vcodec copy -async 1 output.flv");
Run Code Online (Sandbox Code Playgroud)

我可以帮助了解这里发生的错误是什么吗?

exec("ffmpeg -i input.flv -ss 00:00:30.0 -t 00:00:10.0 -acodec copy -vcodec copy -async 1 output.flv",$output);
Run Code Online (Sandbox Code Playgroud)

我也试过了.但我没有在变量中收到任何错误消息$output

php ffmpeg exec

3
推荐指数
1
解决办法
2553
查看次数

没有足够的变量来适应哨兵

根据exec引用,对exec(或一般的堆栈检查vararg函数)的调用在(char*)NULL参数列表的末尾需要一个aka 0.然而,海湾合作委员会抱怨以下代码

char cmdFullPath[4096]; //yes this 4096 thing is bad coding practice 
...
execl(cmdFullPath, (char*)NULL);

//warning: not enough variable arguments to fit a sentinel
Run Code Online (Sandbox Code Playgroud)

谁知道什么是错的?

c gcc function exec system-calls

3
推荐指数
1
解决办法
9668
查看次数

PHP exec/shell_exec/system无法通过浏览器工作

我正在运行一个带有apache版本1.3.33和PHP版本4.4的SCO Unix盒子.我可以通过cli正确执行exec命令,但是在尝试通过浏览器执行脚本时会遇到麻烦.我的设置是:

  • 安全模式关闭
  • 完全读/写/执行权限
  • 显示所有错误
  • 没有禁用功能

我的代码:htdocs目录中的test_script.php

<?php
exec('ls',$out,$rval);
echo "Output:<hr />";
print "<pre>"; print_r($out); print "</pre>";
echo "Return Value:<hr />";
echo $rval;
?>
Run Code Online (Sandbox Code Playgroud)

我也尝试过显式设置可执行二进制路径.测试脚本与apache是​​相同的用户/组.我也尝试在arg中添加2>&1,但看不到任何变化.先感谢您.

在这里看到类似的.

php apache system exec shell-exec

3
推荐指数
1
解决办法
9338
查看次数

php exec()函数和不同的主机

我有一个脚本,在几个目录中执行一个文件,如下所示:

exec("php-cli $file_path > /dev/null 2>/dev/null &"); //php command-line
Run Code Online (Sandbox Code Playgroud)

这适用于大多数主机,但有些主机不喜欢它并且它不运行,不会产生任何错误.

对于失败的主机,我使用

exec("php $file_path > /dev/null 2>/dev/null &"); //notice the -cli is gone
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.

$ file_path是正在执行的文件的完整路径/home/blah/path/blah.php

我如何制作这种制服,以便它适用于所有服务器(至少unix)

**编辑**

好吧,我这样做,它(很可能)不是正确的方式,但它的工作原理.

而不是只使用php-cli或php,我使用两者,所以如果一个失败,另一个经历.要么php作为cgi或cli运行,其中一个会捕获,并且因为没有输出,所以也没有错误.

exec("php-cli $file_path > /dev/null 2>/dev/null &");
exec("php $file_path > /dev/null 2>/dev/null &");
Run Code Online (Sandbox Code Playgroud)

除非您知道更好的解决方案,否则请告诉我.感谢你的帮助.

php exec command-line-interface

3
推荐指数
1
解决办法
1197
查看次数

使用管道执行命令并在c ++中执行超时(并读取stdout)

我需要你的帮助 !

我做了一个报告deamon(用c ++),需要在服务器上定期执行一堆命令.

一个简单的示例命令是:"/ bin/ps aux |/usr/bin/wc -l"

第一个想法是使用popen()分叉运行命令的子进程,并在父进程中设置一个alarm(),如果命令尚未退出,则在5秒后终止该子进程.

我尝试使用"sleep 20000"作为命令,子进程被杀死但是sleep命令仍在运行...不好.

第二个想法是使用execlp()而不是popen(),它使用简单的命令(即没有管道),如"ls -lisa"或"sleep 20000".我可以得到结果,如果5秒后没有完成,则会杀死进程.

现在我需要执行"/ bin/ps aux |/usr/bin/wc -l"命令,显然它不能直接使用execlp(),所以我尝试了"hack":

execlp("sh","sh","-c","/bin/ps aux | /usr/bin/wc -l",NULL);
Run Code Online (Sandbox Code Playgroud)

我工作......或者说我想...我试过了

execlp("sh","sh","-c","sleep 20000",NULL); 
Run Code Online (Sandbox Code Playgroud)

只是为了确定并且子进程在5秒后被终止(我的超时)但是sleep命令就在那里...

我愿意接受建议(我会讨价还价)!

提前致谢 !

TLDR;

我需要一种方法:

  • 执行"复杂"命令,例如"/ bin/ps aux |/usr/bin/wc -l"
  • 得到它的输出
  • 如果它需要超过5秒,请确保它被杀死(ps命令只是示例,实际命令可能永远挂起)

c++ command timeout pipe exec

3
推荐指数
1
解决办法
2784
查看次数

尝试使用nodejs运行git shortlog时,Exec不返回任何内容

我试图通过git shortlog这种方式在nodejs上获取结果:

var exec = require('child_process').exec;
exec("cd /tmp/"+folder +" && git shortlog", {maxBuffer: 500*1024}, function(error, stdout, stderror){
    console.log(arguments);
});
Run Code Online (Sandbox Code Playgroud)

我的回调从未使用此方法调用,程序似乎无限期地处理某些事情.

当我在提示符中启动此命令时,我得到了结果.

尝试将结果重定向到文件会创建一个空文件:

"cd /tmp/"+folder +" && git shortlog > stats.txt"
Run Code Online (Sandbox Code Playgroud)

但如果我使用,git log我会得到我的结果.

你知道为什么我的回调永远不会被调用git shortlog吗?

编辑:我使用spawn得到了相同的结果:

exec("cd /tmp/"+folder, function(err){
    if(err){
        throw err;
    }

    var shortlog = spawn('git', ['shortlog']);
    shortlog.stdout.on('data', function (data) {
        console.log('stdout: ' + data);
    });

    shortlog.stderr.on('data', function (data) {
        console.log('stderr: ' + data);
    });

    shortlog.on('close', function (code) {
        console.log('child process exited with code …
Run Code Online (Sandbox Code Playgroud)

git exec node.js

3
推荐指数
1
解决办法
2405
查看次数

C - exec没有输出到管道中

我正在制作一个程序,最终能够(理论上)为传递给它的任何shell命令工作.我的问题是运行的exec不会将其输出放入管道,而是在运行时看起来好像初始调用是进入管道而已?我试过先冲洗stdout但它不起作用.任何帮助表示赞赏!

int main(int argc, char *argv[]) {

    int i=0, pid;
    int dataPipe[2];
    pipe(dataPipe);

    char *newArgs[5] = {"/bin/sh", "-c", "ls", "-a", NULL};

    if ((pid = fork()) < 0) {

        printf("Error: could not fork!");
        exit(2);
    }

    else if (pid == 0) {

        close(dataPipe[0]);
        fflush(stdout);

        dup2(dataPipe[1], 1);
        close(dataPipe[1]);

        if (execvp(newArgs[0], newArgs) < 0) {

            printf("Command Failed to exucute!");
            exit(3);
        }
    }

    else {

        char buf[BUFFER];
        close(dataPipe[1]);

        wait(0);
        printf("Command exexuted correctly!\n");

        while(read(dataPipe[0], buf, BUFFER) != 0) {
            printf("Here is the command's output:\n%s\n", buf);
        } …
Run Code Online (Sandbox Code Playgroud)

c stdin stdout pipe exec

3
推荐指数
1
解决办法
660
查看次数