通过网络"non-absolute home"错误:SSH



有问题的代码

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

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

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

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

更新

感谢@Phrogz - 解决此问题的是将 ENV['HOME'] 设置为"/home/deploy"。 但是,我还没有弄清楚为什么$HOME在服务器上设置为"."。 所以,我会把这个问题放在没有"答案"的情况下,直到我或其他人弄清楚。 必须手动设置HOME感觉更像是"黑客"而不是适当的解决方案,但它确实有效。

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

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

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

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

Linux 根据

/etc/passwd文件设置此信息。

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

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

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

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

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

最新更新