Até agora, encontrei a seguinte solução usando o FIFO nomeado:
$ mkfifo -m=600 fifo
$ cat ~/.ssh/id_rsa >fifo | ssh-add fifo
Identity added: fifo (fifo)
onde -m
define a permissão FIFO.
Eu tenho o script que carrega a chave SSH da variável (como parte do script no ambiente de IC) para não manter o arquivo privado no repositório público, no entanto ssh-add
reclama das permissões erradas (e < href="https://unix.stackexchange.com/a/61008/21471"> parece que não é possível ignorá-lo ). Então, minha abordagem é encontrar o método de alterar a permissão do pipe anônimo criado instantaneamente.
Por exemplo:
$ 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
mostra a permissão 0660
. Eu verifiquei meu umask
e parece que não tem nada a ver com isso.
Aqui está um teste simples (no OS X, que por padrão tem 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.
No Linux, parece funcionar, porque é 0500
por padrão. De onde esta permissão é controlada?
Para esclarecer, não estou tentando alterar a permissão de nenhum arquivo, pois gostaria de usar um canal anônimo.
A questão é:
Como faço para alterar temporariamente a permissão de um pipe?
Você pode envolver ssh-add
em um programa que executa chmod
no caminho /dev/fd/N
ou fchmod
no descritor de arquivo.
Por exemplo, em uma máquina Linux em que não recebo nenhuma reclamação de ssh-add
usando as permissões padrão, posso reproduzir o erro fazendo isso:
perl -e 'chmod 0777, $ARGV[0];exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)
Se isso reproduzir o problema, isso deverá resolvê-lo:
perl -e 'chmod 0600, $ARGV[0];exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)
O chmod
é fornecido com um nome de caminho como /proc/self/fd/11
, mas altera as permissões no inode do canal real (já que o chmod não funciona em links simbólicos). Isso deve ter o mesmo efeito, mas usando fchmod:
perl -e 'open P, "<", $ARGV[0]; chmod 0600, \*P;close P;exec "ssh-add", $ARGV[0];' <(cat ~/.ssh/id_rsa)
Este deve ter o mesmo efeito, usando fchmod e aproveitando o fato de que o nome do caminho está em um formato previsível para evitar o extra aberto:
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)
Esses scripts perl pareceriam menos feios como programas em C; convertê-los é simples quando você identifica um que funciona no seu ambiente de destino.
Tags permissions bash umask pipe