8

有问题的代码

Net::SSH.start('server name', 'user')

这将返回“非绝对的家”。“用户”实际上确实有一个主目录。一种建议的方法是使用 IdentityFile 的完整路径修改 ~/.ssh/config。这并没有解决问题。

最疯狂的部分是,如果通过 irb 或控制台调用,代码可以正常工作。当我们尝试从类方法(使用相同的代码)中调用它时,它会返回“非绝对主页”错误。

“用户”也可以毫无问题地通过命令行 ssh 进入服务器。服务器正在运行 Ubuntu。

更新

感谢@Phrogz - 解决此问题的方法是将 ENV['HOME'] 设置为 '/home/deploy'。但是,我还没有弄清楚为什么 $HOME 被设置为“。” 在服务器上。所以,在我或其他人弄明白之前,我会在没有“答案”的情况下留下这个问题。不得不手动设置 HOME 感觉更像是“黑客”而不是正确的解决方案,但它确实有效。

4

3 回答 3

2

我们刚刚遇到了同样的问题,并找到了根本原因。我们将脚本作为服务运行,如果您检查服务手册页,它会在运行脚本之前删除大多数环境变量,包括 HOME。不知道你的场景是不是一样,但是没有设置HOME。

net-ssh 想从用户主文件夹中查找 ssh 配置,所以它曾经强制 ENV['HOME'] 为“。” 如果没有设置。但是当 File.expand_path 尝试扩展“~/.ssh”时,会引发 ArgumentError。

这是两个月前修复的(https://github.com/net-ssh/net-ssh/pull/98),所以更新你的 net-ssh gem 应该可以解决这个问题。

于 2013-06-19T09:22:59.360 回答
1

如果未设置,它肯定可以通过设置 HOME env var 来工作。

于 2013-05-14T14:39:24.057 回答
0

Linux 根据/etc/passwd文件设置此信息。

检查用户存在/etc/passwd的内容deployer。它应该在列表的底部附近。

项目以冒号分隔。的值ENV['HOME']应该是该行中倒数第二个条目。

它是空白的,即有两个冒号吗?

我怀疑您的 HOME 变量不存在于 中,/etc/passwd并且被设置在默认点文件之一中,即类似.bashrc. 然后,.bashrc如果您的应用程序通过不获取您的点文件的 init.d 脚本运行,则会短路。.bashrc(如果通过非交互式 shell 执行,许多文件会停止加载剩余的命令)。

希望这会有所帮助,并请回复您的发现。

于 2012-12-26T21:36:53.740 回答