这是一个益智游戏。如果我从命令行运行命令来远程复制文件,它可以很好地工作。如果我在服务器上的脚本(托管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作业运行时它才会失败。
以下是事件的顺序:
我已经尝试使用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工作。
答案 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回答了他自己的问题。我想我会留下这个,以防万一有类似问题的未来访问者。我想我应该添加“或者不运行你正在运行的命令”以了解它可能发生的原因。