【问题标题】:SSH via /sbin/ssh cannot read RSA-Key-File (running from console works)通过 /sbin/ssh 的 SSH 无法读取 RSA-Key-File(从控制台运行)
【发布时间】:2020-02-24 20:11:31
【问题描述】:

我正在尝试通过 SSH 从我的 C++ 应用程序连接到服务器(并发送关闭命令)。我已经通知服务器我的 SSH 密钥(在我的基于 FreeBSD 的 Freenas 服务器上更新了 authorized_keys)。

以下控制台命令立即生效(Manjaro Linux 控制台):

ssh -i /home/[uname]/.ssh/amd_freenas root@freenas.local poweroff

我正在尝试使用我的 C++ 代码中的以下命令来执行完全相同的操作:

execl("/sbin/ssh", "ssh", "-i /home/[uname]/.ssh/amd_freenas", "root@192.168.178.48", "poweroff", (char*)NULL);

从我的程序调用时,控制台输出始终显示我的 SSH 文件不存在,这是不正确的,因为直接控制台命令也没有问题(图片显示比较,上面的命令来自代码,底部一个直接在控制台中)。 错误输出为:

Warning: Identity file  /home/al/.ssh/amd_freenas not accessible: No such file or directory.

我试图更改文件的权限(chmod 600),我试图将它移到别处并从那里读取。我不知道为什么这不起作用。该文件是我的私钥,所以应该是正确的。有人可以帮忙吗?

enter image description here

【问题讨论】:

  • SSH 作为库提供。为什么要费心调用预构建可执行文件?
  • @JesperJuhl 因为发送一个 SSH 命令需要 10 行代码。现在够我用了。

标签: c++ linux ssh console


【解决方案1】:
execl("/sbin/ssh", "ssh", "-i /home/[uname]/.ssh/amd_freenas", ...

Warning: Identity file  /home/al/.ssh/amd_freenas not accessible
                      ^^

ssh-i 后面的空格解释为文件名的一部分。可以看到报错信息中key文件名前多了一个空格,因为ssh认为名字有前导空格。

您应该通过以下方式之一指定参数:

execl("/sbin/ssh", "ssh", "-i", "/home/[uname]/.ssh/amd_freenas", ...

execl("/sbin/ssh", "ssh", "-i/home/[uname]/.ssh/amd_freenas", ...

【讨论】:

  • 你是个传奇,谢谢。我自己永远不会发现这一点,谢谢!刚刚对其进行了测试,它可以将选项与不带空格的路径连接起来:-i/home/al/.ssh/amd_freenas
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 2014-03-08
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
相关资源
最近更新 更多