我有一个从变量加载 SSH 密钥的脚本(作为 CI 环境中脚本的一部分),以便不将私有文件保留在公共存储库中,但是ssh-add
抱怨权限错误(并且似乎无法绕过它)。所以我的方法是找到更改动态创建的匿名管道权限的方法。
例如:
$ stat <(:)
File: ‘/dev/fd/63’
Size: 0 Blocks: 0 IO Block: 512 fifo
Device: 397f3928h/964639016d Inode: 818277067 Links: 0
Access: (0660/prw-rw----) Uid: ( 501/ kenorb) Gid: ( 20/ staff)
Access: 2015-10-10 22:33:30.498640000 +0100
Modify: 2015-10-10 22:33:30.498640000 +0100
Change: 2015-10-10 22:33:30.498640000 +0100
Birth: 2015-10-10 22:33:30.498640000 +0100
显示0660
许可。我检查过我的umask
,似乎与此无关。
这是一个简单的测试(在 OS X 上,默认情况下为 0660):
$ ssh-add <(cat ~/.ssh/id_rsa)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0660 for '/dev/fd/63' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
在 Linux 上它似乎可以工作,因为它是0500
默认的。这个权限是从哪里控制的?
需要澄清的是,我不想更改任何文件的权限,因为我想使用匿名管道。
问题是:
如何临时更改管道的权限?
答案1
到目前为止,我已经找到了使用命名 FIFO 的以下解决方法:
$ mkfifo -m 600 fifo
$ cat ~/.ssh/id_rsa >fifo | ssh-add fifo
Identity added: fifo (fifo)
其中该选项-m
设置 FIFO 权限。
答案2
您也许可以封装ssh-add
在一个程序中,该程序chmod
在/dev/fd/N
路径或fchmod
文件描述符上执行 a 操作。
例如,在 Linux 机器上,我没有因ssh-add
使用默认权限而收到任何投诉,我可以通过执行以下操作来重现错误:
perl -e 'chmod 0777, $ARGV[0];exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)
如果重现问题,那么这应该可以解决它:
perl -e 'chmod 0600, $ARGV[0];exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)
提供chmod
了类似的路径名/proc/self/fd/11
,但它更改了实际管道 inode 的权限(因为 chmod 不适用于符号链接)。这应该具有相同的效果,但使用 fchmod:
perl -e 'open P, "<", $ARGV[0]; chmod 0600, \*P;close P;exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)
这应该具有相同的效果,使用 fchmod 并利用路径名采用可预测格式的事实来避免额外的打开:
perl -e '$ARGV[0] =~ m,^(?:/proc/self|/dev)/fd/(\d+)\z, and $^F=$1 and open P, "<&=$1" and chmod 0600, \*P;exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)
这些 Perl 脚本看起来不像 C 程序那样难看;一旦您确定了适合您的目标环境的方法,转换它们就很简单。