如何更改匿名管道的权限?

如何更改匿名管道的权限?

我有一个从变量加载 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 程序那样难看;一旦您确定了适合您的目标环境的方法,转换它们就很简单。

相关内容