파이프, 리디렉션 및 원격 연결이 포함된 셸 명령을 이해하는 데 도움이 필요합니다.

파이프, 리디렉션 및 원격 연결이 포함된 셸 명령을 이해하는 데 도움이 필요합니다.

나는 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"는 실제로 내용이 아니며 입력 파일의 이름입니다.

관련 정보