익명 파이프의 권한을 어떻게 변경합니까?

익명 파이프의 권한을 어떻게 변경합니까?

공용 저장소에 개인 파일을 보관하지 않기 위해 CI 환경의 스크립트의 일부로 변수에서 SSH 키를 로드하는 스크립트가 있지만 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.

0500Linux에서는 기본값 으로 작동하는 것 같습니다 . 이 권한은 어디에서 제어됩니까?

명확히 하자면 익명 파이프를 사용하고 싶기 때문에 파일의 권한을 변경하고 싶지 않습니다.

문제는 다음과 같습니다

파이프의 권한을 일시적으로 변경하는 방법은 무엇입니까?

답변1

지금까지 명명된 FIFO를 사용하여 다음 해결 방법을 찾았습니다.

$ mkfifo -m 600 fifo
$ cat ~/.ssh/id_rsa >fifo | ssh-add fifo
Identity added: fifo (fifo)

이 옵션은 -mFIFO 권한을 설정합니다.

답변2

경로나 파일 설명자 에서 작업을 수행하는 ssh-add프로그램에서 이를 캡슐화할 수 있습니다 .chmod/dev/fd/Nfchmod

예를 들어, 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 프로그램만큼 보기 흉하지 않습니다. 일단 대상 환경에 적합한 것이 무엇인지 결정하면 변환하는 것은 간단합니다.

관련 정보