2011-11-01 103 views
2

这是一个益智游戏。如果我从命令行运行一个命令来远程复制一个文件,它完美的工作。如果我在服务器(托管Hudson)的脚本内部运行相同的命令,它也可以完美地运行,与从命令行运行hudson一样。但是,如果我运行的确切命令从哈德森工作bash脚本里面的函数,它失败:在Hudson调用的脚本中运行cp命令失败

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

的变量定义为:

original_tarball=flash_board.tar.gz 

,并在范围(可变扩展在脚本中正常工作)。

原来的命令是:

ssh -n -o stricthostkeychecking=no [email protected]$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 [email protected]$IP_ADDRESS cp /opt/$original_tarball /opt/$original_tarball.bak 

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

仅供参考,所有变量都被检查为有效。我本来以为这是一个替代误差,但是这似乎并不如此,所以后来我试图与哈德森凭据运行它:

sudo -u hudson ssh -n -o stricthostkeychecking=no [email protected]$IP_ADDRESS ssh -n -o stricthostkeychecking=no 169.254.0.2 cp /opt/$original_tarball /opt/$original_tarball.bak 

我得到同样的结果(它的工作原理)。所以只有当这个命令从Hudson作业运行时才会失败。

这里的事件序列:

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

我试过这个使用ssh与-p 1601(正确的端口到阿拉戈方面)。

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

喜欢的东西:

scp -o stricthostkeychecking=no [email protected]$IP_ADDRESS /opt/$original_tarball /opt/$original_tarball.bak 

我有一对夫妇的开发者的看看这个,他们被难倒为好。 (A)为什么这会失败&(B)如何解决它。我很确定我可以编写脚本在远程机器上本地运行,但似乎并不需要。

哦,如果我上运行Montevista板相同的指令(这意味着我没有跨越SPI总线(169.254.0.2)去,从哈得逊工作完美。

+0

部署图请问?我很困惑你的第五代码块中的双重ssh。我将-vv放在ssh上,并从测试脚本中尽可能多地打印出环境信息(PATH,'cp'等)以找出差异。 – themel

+0

@themel。我太新了,无法上传图片。双ssh允许我从hudson服务器转到Montevista板,Montevista板通过SPI链接与Arago板交流,所以第二个ssh到169.254.0.2就是为了跳跃。我无法直接访问Arago板,我必须通过端口1601或执行双重ssh才能到达那里(这两种方法都可以与任何其他bash命令一起工作,但我必须小心,因为那里是两个主板上的不同版本的busybox)。 – delliottg

+0

检查文件权限。 –

回答

1

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

原来是飞行员的错误,我写的if声明(阿拉戈& Montevista)这两个板之间进行区分,然后抽象出来传递给if声明它是含糊其董事会点变量被传入,所以if逻辑总是抓住第一场比赛(因为它应该),我试图复制在Arago板上的flash脚本在Montevista板上并不存在(当然,它有一个不同的名字),所以返回的错误是绝对正确的。

对不起,并感谢所有的努力来帮助。

0

cp:can stat'/opt/flash_board.tar。gz':没有这样的文件或目录

这就是说哈德森看不到该文件。我会在你的shell脚本中执行ls -la /opt。这将向您显示/opt目录的权限,以及您的脚本是否可以列出该文件。

当你在它的时候,在Hudson机器上也做一个du -f,看看这个/opt目录是远程挂载还是可能有问题的东西。

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

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

+0

你的建议是解决方案的根源,我写的测试脚本是按照你的建议做的,然后我用明确的名字添加了复制,这些名字完美地工作。然后我添加了变量名称,这些变量名称继续工作,所以我添加了if语句来区分不同的董事会,而瞧,它开始失败。我在整个脚本上设置了-xv,并意识到if语句总是选择第一个显示的选项。这很难看出来,因为这两个陈述实际上是相同的,但是这些分歧终于跳出来了。感谢您的想法! – delliottg

0

出现问题的一个显而易见的方式是,它在不正确的机器上运行,可能是由于行长限制或奇怪的引用问题。

我想尝试改变命令到… uname -a… hostname -f看看你是否得到正确的机器。或者,或者,… cp /proc/cpuinfo /tmp/this-machine然后查看哪台机器获取该文件。

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