![如何使用从文件读取的路径读取 ssh 密钥文件的内容?](https://linux22.com/image/152559/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E4%BB%8E%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E7%9A%84%E8%B7%AF%E5%BE%84%E8%AF%BB%E5%8F%96%20ssh%20%E5%AF%86%E9%92%A5%E6%96%87%E4%BB%B6%E7%9A%84%E5%86%85%E5%AE%B9%EF%BC%9F.png)
我需要使用驻留在文件中的给定路径读取 ssh 密钥的内容,如下所示:我的 ssh 私钥是:~/.ssh/firstname.lastname
当我cat ~/.ssh/firstname.lastname
在 ubuntu 上调用终端时,我得到了预期的结果。但是,如果我从任何文本文件中获取 ssh 密钥的路径,那么我会得到cat: '~/.ssh/firstname.lastname': No such file or directory
.
例如,我有path_to_key.txt
包含单行的文件~/.ssh/firstname.lastname
。
因此,在终端中调用cat $(cat path_to_key.txt)
会返回上面提到的错误消息。
所有文件都驻留在同一目录下,并且调用也从该目录发生。
为什么我不能这样“猫”?
答案1
这些猫都工作了,但波形符 ( ~
) 没有像通常在命令行上那样进行处理。内部cat
返回文件的内容,但外部cat
已经处理了波浪号扩展、通配符、变量扩展等。因此,外部猫通过文字的名称~/.ssh/firstname.lastname
而不是预期的/path/to/your/home/.ssh/firstname.lastname
.
两种解决方案:
- 包含文件的绝对路径:而不是包含 的 path_to_key.txt
~/.ssh/firstname.lastname
,它将包含(例如)/home/you/.ssh/firstname.lastname
- 将外部包裹起来
cat
,eval
以便生成的命令(发生命令替换后)为再加工的:eval cat $(cat path_to_key.txt)
。请注意,这会带来额外的评估层,因此该密钥文件内的任何重定向或后续命令都会被执行 - 当然,还有您想要的波形符扩展。