在Hudson调用的脚本中运行时,cp命令失败

时间:2011-11-01 21:12:05

标签: bash ssh hudson embedded-linux scp

这是一个益智游戏。如果我从命令行运行命令来远程复制文件,它可以很好地工作。如果我在服务器上的脚本(托管Hudson)中运行相同的命令,它也可以完美地运行,与从命令行运行hudson作业相同。但是,如果我在Hudson作业的bash脚本中运行该确切命令作为函数,它将失败并显示:

cp: cannot stat '/opt/flash_board.tar.gz': No such file or directory

变量定义为:

original_tarball=flash_board.tar.gz

并且在范围内(变量扩展在脚本中正常工作)。

原始命令是:

ssh -n -o stricthostkeychecking=no root@$IP_ADDRESS ssh -n -o stricthostkeychecking=no 169.254.0.2 cp /opt/$original_tarball /opt/$original_tarball.bak

我也尝试过:

ssh -n -p 1601 -o stricthostkeychecking=no root@$IP_ADDRESS cp /opt/$original_tarball /opt/$original_tarball.bak

指向正确的端口,但以完全相同的方式失败。

作为参考,所有变量都已被检查有效。我最初认为这是一个替换错误,但似乎并非如此,所以我尝试使用Hudson凭据运行它:

sudo -u hudson ssh -n -o stricthostkeychecking=no root@$IP_ADDRESS ssh -n -o stricthostkeychecking=no 169.254.0.2 cp /opt/$original_tarball /opt/$original_tarball.bak

我得到完全相同的结果(它有效)。所以只有当这个命令从Hudson作业运行时它才会失败。

以下是事件的顺序:

  • Hudson工作设置参数&调用shell脚本。
  • 脚本中的一个函数尝试通过SPI总线从嵌入式Montevista(Linux)板远程复制文件到第二个嵌入式Arago(Linux)板
  • 两块主板都在同一主板上,但除了通过串行控制台会话外,没有办法直接访问Arago板(这是不可行的,这是一个在网络上运行的自动化作业)。

我已经尝试使用ssh和-p 1601(Arago端的正确端口)。

我可以使用scp将远程文件复制到与具有不同文件扩展名的远程文件相同的位置吗?

类似的东西:

scp -o stricthostkeychecking=no root@$IP_ADDRESS /opt/$original_tarball /opt/$original_tarball.bak

我让几个开发人员看了一眼,他们也被困了。任何人都有任何想法(A)为什么会失败& (B)如何解决它。我很确定我可以写一个脚本在远程机器上本地运行,但这似乎不是必要的。

哦,如果我在Montevista板上运行完全相同的命令(这意味着我不必通过SPI总线(169.254.0.2),它可以完美地从Hudson工作。

3 个答案:

答案 0 :(得分:1)

所以,事实证明这与问题完全无关。我用测试Hudson脚本将问题分解成小块,从原始脚本中添加越来越多的复杂性,直到它像以前一样失败。

原来是导航错误,我写了一个if语句来区分两个板(Arago和Montevista),然后抽象出传递给if语句的变量传递哪个板的模糊不清,所以if逻辑总是抓住第一个匹配(应该这样),我试图在Arago板上复制的flash脚本不存在于Montevista板(嗯,它有不同的名称)所以返回的错误是绝对正确的。

很抱歉旋转并感谢所有的帮助。

答案 1 :(得分:0)

  

cp:无法统计'/opt/flash_board.tar.gz':没有这样的文件或目录

这是说Hudson无法看到该文件。我会在你的shell脚本中做ls -la /opt。这将显示/opt目录的权限,以及您的脚本是否可以列出该文件。

当你在这里时,也要在Hudson机器上执行du -f,看看/opt目录是远程安装还是可能有问题。

您已经说过以运行Hudson任务的用户身份登录并从工作区目录执行它。

现在,我怀疑目录权限是个问题。

答案 2 :(得分:0)

出现问题的显而易见的方法是,不管怎样,它都是在错误的机器上运行,可能是由于行长限制或奇怪的引用问题。

我尝试将命令更改为… uname -a… hostname -f以查看您是否获得了正确的机器。或者,或者… cp /proc/cpuinfo /tmp/this-machine,然后查看哪台机器获取文件。

编辑:我现在看到OP回答了他自己的问题。我想我会留下这个,以防万一有类似问题的未来访问者。我想我应该添加“或者不运行你正在运行的命令”以了解它可能发生的原因。