【问题标题】:Running linux sftp command in perl doesnt work在 perl 中运行 linux sftp 命令不起作用
【发布时间】:2015-07-16 02:25:14
【问题描述】:

当我在终端中运行它时,它可以工作

/usr/bin/sftp -o "IdentityFile=/opt/apps/doc/bin/id_rsa" -b /opt/apps/doc/bin/batch.txt DMS2@convpc1

但是,当我在 perl 脚本中运行它时,什么也没有发生

system("/usr/bin/sftp -o \"IdentityFile=/opt/apps/doc/bin/id_rsa\" -b /opt/apps/doc/bin/batch.txt DMS2@convpc1");

我花了一整天的时间试图弄清楚如何对我的文件进行 sftps,但我无法找出问题所在?有什么建议吗?

编辑:我做了更多的测试。我将整个命令放在一个 test.sh 文件中。我从终端运行了 test.sh,它可以工作。我将 perl 文件更改为 system("/opt/app/doc/bin/test.sh") 然后运行它,没有任何反应。我在系统命令之前添加了打印语句,它们可以工作,但是系统命令仍然不起作用,因为我没有看到我的文件被移动。

【问题讨论】:

  • system 替换为print 是您试图找出问题的方法之一吗?
  • 您可以考虑尝试Net::SFTP 而不是使用system.通常,使用原生 Perl 模块而不是逃逸到系统会更有效,在这种情况下,系统调用是有问题的,因此可能也值得调查以解决您的问题。

标签: linux perl sftp


【解决方案1】:

系统命令可能正在吃引号字符,'@'字符需要转义为\@。

试试这个看看你是否真的在运行你试图运行的命令:

my $cmd = "/usr/bin/sftp -o \"IdentityFile=/opt/apps/doc/bin/id_rsa\" -b /opt/apps/doc/bin/batch.txt DMS2@convpc1";

sys($cmd);

sub sys {
    my ($cmd) = @_;
    print "About to run '$cmd'\n";
    (system($cmd) == 0) or die "Unable to run '$cmd' : $!";
}

【讨论】:

  • 由于不需要插值,因此也可以对字符串进行单引号(例如,system('/usr/bin/sftp -o "IdentityFile=/opt/apps/doc/bin/id_rsa" -b /opt/apps/doc/bin/batch.txt DMS2@convpc1'))。
  • 尝试使用单引号运行,正如 Max Lybbert 上面所建议的那样。
  • 我做了更多的测试。我将整个命令放在一个 test.sh 文件中。我从终端运行了 test.sh,它可以工作。我将 perl 文件更改为 system("/opt/app/doc/bin/test.sh") 然后运行它,没有任何反应。我在系统命令之前添加了打印语句,它们可以工作,但是系统命令仍然不起作用,因为我没有看到我的文件被移动。由于我把命令放在了 sh 中,所以引号应该不再重要了
  • 在 test.sh 中添加一些 echo 语句,看看它们是否运行。
  • cat foo.sh #!/bin/sh echo "hello world" perl -e 'system("foo.sh");' hello world
【解决方案2】:

试试下面

    $result = "/usr/bin/sftp -o \"IdentityFile=/opt/apps/doc/bin/id_rsa\" -b /opt/apps/doc/bin/batch.txt DMS2\@convpc1";
    system($result);

您是否遇到任何语法错误?试试“perl -cw scriptname”看看结果。

我会推荐Net::SFTP,这对于建立SFTP连接非常方便。

【讨论】:

  • 使用变量而不是文字应该没有什么区别。但是使用 Net::SFTP 是最好的建议。赞成。
  • @MaxLybbert:Net::SFTP 是一个旧的、无人维护的、有缺陷的模块,它依赖于 Net::SSH::Perl,安装起来非常困难(而且它也很旧,无人维护和越野车)。不是最好的建议。
  • 感谢有关 Net::SFTP 的信息。因此,虽然建议特别糟糕,但我坚持认为总体思路(使用模块而不是调用 system)仍然是最好的方法。
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 2022-10-19
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多