웹사이트 검색

로그인에 SSH(Secure Shell) 사용 및 Linux에서 데이터 전송에 SCP(Secure Copy) 사용


SSH는 보안 쉘을 나타냅니다. 암호화된 원격 로그인 프로토콜입니다. 각 노드에 설정되면 해당 네트워크의 다양한 다른 노드와 통신하는 데 사용할 수 있습니다.

SSH의 주요 이점은 다음과 같습니다.

  • SSH는 RSA 암호화 알고리즘을 사용하여 공개 및 개인 키를 생성하므로 침입이 매우 어렵습니다.
  • SSH는 원격 로그인 프로토콜이므로 랩톱에서 구성할 수 있습니다. 즉, 랩톱을 사용하여 Raspberry Pi 클러스터에 무선으로 연결할 수 있습니다.
  • SCP(Secure Copy) 및 SFTP(Secure File Transfer Protocol)와 같은 프로토콜이 SSH 위에서 실행되기 때문에 이를 사용하여 파일과 폴더를 한 노드에서 다른 노드로 직접 전송할 수 있습니다.
  • SSH는 1회 로그인을 지원합니다. 즉, 처음 로그인할 때만 자격 증명을 입력하면 됩니다. 두 번째 로그인부터는 필요하지 않습니다.

SSH 키 생성부터 시작하겠습니다. SSH를 사용하려면 데이터 전송이 발생할 수 있도록 두 개 이상의 노드 간에 키가 생성되어야 합니다. 우리는 암호화를 위해 RSA를 사용합니다. 하나의 노드에서 키를 생성하고 개인 또는 비밀 키를 갖게 됩니다. 동일한 노드는 또한 이 노드에 데이터를 보내려는 다른 노드로 보낼 공개 키를 생성합니다. 데이터를 보내려는 노드에서 다음 명령을 수행합니다. 이 노드를 \마스터 노드\라고 하고 다른 노드를 \작업자 노드\라고 합니다.

cd ~
ssh-keygen --t rsa --C ""

이 두 명령은 /home/pi/_ssh/id_rsa의 기본 위치를 설정하여 키를 저장합니다.

암호를 묻는 메시지가 표시되면 암호를 비워 둡니다. 이 작업이 완료되면 다음 단계는 퍼블릭 키를 작업자 노드로 보내는 것입니다. 따라서 작업자 노드가 네트워크에 연결되어 있는지 확인하십시오. 이제 작업자 노드에서 암호화 키를 설정할 수 있으므로 사용되는 IP 주소는 작업자 노드의 IP 주소입니다. 마스터 노드에서 다음 명령을 실행합니다.

cat ~/.ssh/id_rsa.pub | ssh  "mkdir .ssh;cat >> .ssh/authorized_keys"

SSH 키가 생성되면 마스터 노드에서 키가 전송된 다른 노드에 로그인할 수 있으며 이렇게 하려면 다음 명령을 사용합니다.

ssh 

위 명령에서 \pi\는 사용자를 나타내며 기본적으로 Raspbian을 사용하는 모든 PI는 사용자를 \pi\로 가지며 \192.168.3.216\은 내 클라이언트의 IP입니다. 클라이언트 PI의 IP 주소를 나타내도록 변경해야 합니다.

비밀번호를 묻습니다. 로그인하면 입력하는 모든 명령이 마스터가 아닌 해당 노드에서 실행되지만 출력은 마스터 자체에 표시됩니다. SSH를 사용하여 다른 노드에서 직접 명령을 실행할 수도 있습니다. 예를 들어 다른 노드의 호스트 이름을 변경하려면 다음과 같은 형식으로 이 명령을 사용합니다.

ssh  'sudo echo "cilent003" | sudo nano /etc/hostname'

위에 표시된 것처럼 SSH를 사용하여 실제로 로그인하지 않고도 다른 노드/PI에서 명령을 실행할 수 있습니다. 다음은 IP 주소가 192.168.3.216인 네트워크에서 노드를 안전하게 종료하는 또 다른 예입니다.

ssh  'sudo poweroff'

다음 그림은 SSH를 사용하여 작업자 노드(192.168.3.216)에 로그인하고 작업자 노드에서 제어 터미널을 다시 마스터 노드로 가져오는 방법을 보여줍니다.

위의 그림에서 볼 수 있듯이 작업자 노드에 대한 로그인은 최초를 제외하고는 비밀번호 입력 없이 바로 이루어집니다. 단, 단말의 제어권이 마스터노드(192.168.3.215)로 돌아올 때마다 로그인 크리덴셜을 입력해야 한다. 이러한 방식으로 마스터는 항상 외부 위협으로부터 보호됩니다.

따라서 SSH를 통해 다른 노드에 명령을 내린 후 데이터를 여러 노드로 보내야 하는 상황이 발생할 수 있습니다. 노드 수가 적으면 각 노드에 수동으로 로그인하여 디스플레이와 키보드에 연결하고 파일을 보낼 수 있습니다. 그러나 이것은 클러스터의 크기가 클 때 매우 비효율적인 방법입니다. 더 쉬운 방법은 SCP를 사용하여 파일을 보내는 것입니다. 다음 명령을 사용하여 SCP를 설치합니다.

sudo apt-get install scp

일부 Linux OS에는 SCP가 미리 설치되어 있을 수 있지만 우리가 사용하고 있던 Raspbian에는 SCP가 없었습니다. 단일 파일을 보내는 일반적인 명령은 다음과 같습니다.

scp(로컬 기기의 파일 경로) [email (원격 위치의 경로)

예:

scp /pi/example.c  /pi/project

여기서 데이터를 보낼 원격 장치는 IP 주소로 인식됩니다. 재귀 옵션(-R)을 사용하여 디렉토리의 많은 파일을 보낼 수 있습니다. 예를 들어:

scp -r /pi/project  /pi/project

위의 명령은 /pi/project의 모든 파일을 로컬 호스트에서 IP 주소로 식별되는 원격 호스트의 재귀 폴더로 재귀적으로 전송합니다.

아래 이미지는 다양한 ssh 및 scp 명령을 보여줍니다. 현재 폴더의 내용을 나열하는 것으로 시작한 다음 \scp\를 재귀적으로 호출하여 현재 폴더의 모든 파일을 다른 노드의 폴더로 전송합니다. 그런 다음 다른 노드에 로그인하고 scp가 콘텐츠를 대상으로 성공적으로 전송했음을 보여줍니다.

SCP는 몇 가지 다른 옵션과 함께 사용하여 일부 조건을 충족하도록 전송할 수 있습니다. 다음은 몇 가지 옵션입니다.

    • We can use the "-p" option to preserve modification times, access times, and modes from the original file. Example:

      scp -p test.c :~/

      Here the access time, access modes and last modification time of the file "test.c" will be preserved in the destination node as well.

    • SCP allows the files to be compressed before they can be sent across the network to the destination. This is very useful when the file(s) is very big to be transferred, and hence compressing will increase the speed at which it will be sent. To do this we use the option "-C". Example:

      scp -pC test.c :~/

      Here we can see that multiple options can be used and both their features will be applied to the command.

    • Socket programming involves sending and receiving data through ports and SCP can be used to send data through specific ports to the remote host. This can be done using the "-P" option.Example:

      scp -P 21938 test.c 92.168.3.216:~/

      Here, the port used to send data is 1938.

    • There might be cases, where you wouldn't want to know the status of transfer of files, like in the image above. It makes sense, to turn off the transfer status when there is a large amount of files. We can do that by using the "-q" option. Example:

    scp -rq ~/files :~/files

    여기서 files라는 폴더의 내용은 다른 노드의 files 폴더로 전달되지만 상태 표시줄과 디버깅 메시지는 모두 비활성화되어 표시되지 않습니다.