나는 bash를 사용해 본 경험이 있지만 튜토리얼에서 본 다음 명령이 나를 당황하게 만들었습니다.
cat ~/.ssh/id_rsa.pub | ssh git@remote-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
나는 이 명령이 무엇을 하는지 알고 있다. 파일의 출력을 가져와서 ~/.ssh/id_rsa.pub
원격 ssh
서버로 보내고, 사용자의 홈 디렉터리 아래에 .ssh라는 새 디렉터리를 만든 다음, 라는 새 파일을 만들고 해당 파일에 authorized_keys
내용을 덤프합니다 . id_rsa.pub
내가 이해하지 못하는 것은 이 시점에서 파일의 내용 id_rsa.pub
이주입인증 키 파일에 넣습니다.
따라서 나는 파이프(|)가 출력을 왼쪽으로 보내고 오른쪽의 명령에 공급한다는 것을 알고 있습니다. 그러나 일반적으로 다음과 같이 cat 명령을 사용합니다.
cat "content_to_be_added" >> file_to_be_appended
따라서 내 기억이 정확하다면 id_rsa.pub
>> 전에 주입해야 할 것이 작동하도록 하기 위해 존재하는 것입니다. 그렇다면 정확히 어떻게 작동하며 그 이유는 무엇입니까?
그런데, 내 용어를 자유롭게 수정해 주세요. 그리고 여기 운영자들의 구체적인 이름이 있는지 알려주시면 >>
감사하겠습니다 .
답변1
주문하다
cat >> ~/.ssh/authorized_keys
읽을 파일 이름이 지정되지 않았기 때문에 표준 입력에서 읽고 cat
지정된 파일에 추가합니다. 리디렉션 >>
연산자가 대상 파일을 엽니다.추가. >
대신 in을 사용하면 >>
데이터를 쓰기 전에 대상 파일이 잘립니다(비어집니다).
이 원격 명령에 대한 표준 입력 데이터는 어디 cat
에서 왔습니까? 표준 입력 스트림은 cat
원격 쉘에서 상속됩니다. 원격 쉘은 표준 입력 스트림을 상속합니다 ssh
. 표준 입력은 ssh
파이프에서 파일을 cat
읽는 로컬 명령 으로 전달됩니다.~/.ssh/id_rsa.pub
cat
파이프라인에 로컬이 필요하지 않습니다.
ssh git@remote-server 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
그러나 mkdir
디렉토리를 생성하는 경우 제대로 작동하려면 올바른 권한이 있어야 합니다 ssh
.
ssh git@remote-server 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
또는 데이터를 추가하지 않도록 선택할 수도 있습니다.
ssh git@remote-server 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
답변2
의 cat
경우 파일 이름이 지정되지 않으면 stdin을 stdout으로 복사합니다.
이를 >>
출력 리디렉션 연산자라고 합니다.
그냥 cat >> filename
해추가의데이터는 "filename" 파일의 표준 입력에서 가져옵니다.
귀하의 예에서 cat "content_to_be_added"
"content_to_be_add"는 실제로 내용이 아니며 입력 파일의 이름입니다.