Python WebSSH를 사용하여 브라우저에서 터미널에 연결하는 방법
소개
일반적으로 터미널의 명령줄 앱 또는 SSH 클라이언트가 포함된 터미널 에뮬레이터 소프트웨어를 사용하여 SSH 서버에 연결합니다. Python의 WebSSH와 같은 일부 도구를 사용하면 SSH를 통해 연결하고 웹 브라우저에서 직접 터미널을 실행할 수 있습니다.
이는 여러 상황에서 유용할 수 있습니다. 일반 터미널 창을 시각적으로 이해하기 어려운 방식으로 공유하기 어려울 때 라이브 프레젠테이션이나 데모를 제공하는 데 특히 유용합니다. 또한 명령줄 초보자에게 액세스 권한을 부여할 때 교육 환경에서 도움이 될 수 있습니다. 컴퓨터에 소프트웨어를 설치할 필요가 없기 때문입니다(특히 기본 옵션에 주의 사항이 있는 Windows의 경우). 마지막으로, 특히 Python의 WebSSH는 이식성이 매우 뛰어나고 실행하는 데 Python 이외의 종속성이 필요하지 않습니다. 다른 웹 기반 터미널 스택은 훨씬 더 복잡하고 Linux에만 해당될 수 있습니다.
이 자습서에서는 WebSSH를 설정하고 브라우저에서 SSH를 통해 연결합니다. 그런 다음 선택적으로 SSL 인증서로 보안을 설정하고 프로덕션 배포를 위해 Nginx 리버스 프록시 뒤에서 실행합니다.
전제 조건
- 실행 중인 SSH 서비스가 있는 Windows, Mac 또는 Linux 환경. WebSSH를 로컬에서 실행하는 것이 유용할 수 있지만 로컬 시스템에서 실행 중인 SSH 서비스가 없는 경우 Ubuntu 22.04용 초기 서버 설정 가이드에 따라 원격 Linux 서버를 사용할 수 있습니다.\n
- 패키지 관리자인
pip
와 함께 설치된 Python 프로그래밍 언어입니다. 이 튜토리얼의 1단계에 따라 Ubuntu에 Python 및pip
를 설치할 수 있습니다.\n - 선택적으로 브라우저에서 HTTPS를 활성화하려면 SSL 인증서와 자체 도메인 이름이 필요합니다. Let’s Encrypt SSL 인증서를 검색하기 위해 Certbot 독립 실행형 모드를 사용하는 방법에 따라 인증서를 얻을 수 있습니다. 고유한 도메인 이름이 없는 경우 이 자습서의 처음 두 단계에서 IP 주소를 사용할 수 있습니다.\n
1단계 – WebSSH 설치
Python과 pip를 이미 설치한 경우 Python 3 설치 및 프로그래밍 환경 설정 방법에서 Python 패키지를 설치할 수 있습니다. 가상 환경은 시스템 전체 도구를 설치할 때가 아니라 자신의 프로젝트에서 작업할 때 더 유용합니다.
pip install
을 사용하여 WebSSH 패키지를 설치합니다.
- sudo pip3 install webssh
Output…
Successfully built webssh
Installing collected packages: tornado, pycparser, cffi, pynacl, paramiko, webssh
Successfully installed cffi-1.15.1 paramiko-2.11.0 pycparser-2.21 pynacl-1.5.0 tornado-6.2 webssh-1.6.0
sudo
를 통해 설치하면 wssh
명령이 전체적으로 설치됩니다. which wssh
를 사용하여 이를 확인할 수 있습니다.
- which wssh
Output/usr/local/bin/wssh
이제 WebSSH를 설치했습니다. 다음 단계에서는 실행하고 연결합니다. 하지만 먼저 방화벽 규칙을 추가해야 합니다. WebSSH는 기본적으로 포트 8888에서 실행됩니다. ufw
를 방화벽으로 사용하는 경우 ufw
를 통해 해당 포트를 허용
합니다.
- sudo ufw allow 8888
이 자습서의 뒷부분에서 해당 방화벽 규칙을 다시 살펴보겠습니다.
2단계 – WebSSH 실행 및 연결
로컬 시스템에서 WebSSH를 실행 중인 경우 시작할 추가 인수 없이 wssh
를 단독으로 실행할 수 있습니다. 원격 서버에서 WebSSH를 실행하는 경우 일반 HTTP를 통한 원격 연결을 허용하려면 --fbidhttp=False
플래그를 추가해야 합니다. 이것은 보호되지 않은 네트워크를 통해 연결하는 경우 안전하지 않지만 데모에 유용하며 이 자습서의 뒷부분에서 WebSSH를 보호합니다.
- wssh --fbidhttp=False
이제 WebSSH에 연결하고 로그인할 수 있습니다. 웹 브라우저에서 your_domain:8888
로 이동합니다(your_domain 대신 localhost
사용). 로컬에서 실행 중인 경우). WebSSH 로그인 페이지가 표시됩니다.

일반 SSH 자격 증명을 제공합니다. DigitalOcean의 초기 서버 설정 가이드를 따랐다면 비밀번호가 아닌 키 기반 인증을 사용하게 될 것입니다. 즉, 연결하려는 서버의 호스트 이름
, 서버의 사용자 이름
및 SSH 키만 지정하면 됩니다. 로컬 홈 디렉토리 내의 .ssh/
폴더(일반적으로 이름은 id_rsa
).
참고: 호스트 이름을 수동으로 지정해야 한다는 점에서 짐작할 수 있듯이 WebSSH는 실행 중인 서버가 아닌 다른 서버에 연결하는 데에도 사용할 수 있습니다. 이 자습서에서는 연결하려는 동일한 서버에서 실행됩니다.
연결 버튼을 클릭하면 기본 터미널 환영 프롬프트가 표시됩니다.

이 시점에서 SSH를 통해 연결한 것처럼 터미널을 정상적으로 사용할 수 있습니다. 여러 사용자가 동일한 WebSSH 인스턴스를 통해 동시에 연결할 수도 있습니다. 비디오를 스트리밍하거나 캡처할 목적으로만 로컬 시스템에서 WebSSH를 실행하는 경우 이것이 필요한 전부일 수 있습니다. WebSSH를 시작한 터미널(WebSSH 터미널이 아님)에서 Ctrl+C
를 입력하여 완료되면 WebSSH 서버를 중지할 수 있습니다.
원격 서버에서 실행 중인 경우 보안되지 않은 HTTP 연결 뒤에 프로덕션 환경에서 WebSSH를 사용하고 싶지 않을 것입니다. 여전히 SSH 서비스의 인증 메커니즘에 의해 보호되지만 HTTP를 통한 SSH 연결을 사용하면 상당한 보안 위험이 있으며 다른 사람이 SSH 자격 증명을 훔칠 수 있습니다. 다음 단계에서는 일반 SSH 연결보다 덜 안전하지 않도록 WebSSH 인스턴스를 보호합니다.
3단계 – (선택 사항) SSL 인증서로 WebSSH 보안
이 단계를 완료하려면 자신의 도메인 이름과 SSL 인증서를 이미 획득했어야 합니다. 이를 수행하는 한 가지 방법은 독립 실행형 모드에서 LetsEncrypt를 사용하는 것입니다.
LetsEncrypt가 인증서를 검색하면 기본적으로 인증서를 /etc/letsencrypt/live/your_domain
에 저장합니다. 가지고 있는지 확인하십시오.
- sudo ls /etc/letsencrypt/live/your_domain
OutputREADME cert.pem chain.pem fullchain.pem privkey.pem
HTTPS 지원으로 WebSSH를 실행하려면 인증서 경로와 키 경로를 제공해야 합니다. 이들은 fullchain.pem
및 privkey.pem
입니다. 기본적으로 WebSSH는 포트 4433에서 HTTPS 액세스를 제공하므로 방화벽에서도 해당 포트를 엽니다.
- sudo ufw allow 4433
다음으로 허용해야 합니다.
그런 다음 인증서 및 키에 대한 경로를 사용하여 WebSSH를 실행합니다.
- sudo wssh --certfile='/etc/letsencrypt/live/your_domain/fullchain.pem' --keyfile='/etc/letsencrypt/live/your_domain/privkey.pem'
웹 브라우저에서 https://your_domain:4433
으로 이동하면 이전 단계와 동일한 인터페이스가 표시되고 이제 HTTPS가 지원됩니다. 이제 안전한 프로덕션 구성을 위한 설정으로 충분합니다. 그러나 여전히 터미널에서 직접 wssh
앱을 실행하고 있으며 비정상적인 포트에서 브라우저에 액세스하고 있습니다. 이 자습서의 마지막 두 단계에서는 이러한 제한 사항을 모두 제거합니다.
4단계 – (선택 사항) Nginx 역방향 프록시 뒤에서 WebSSH 실행
다른 웹 대면 애플리케이션 앞에 Nginx와 같은 웹 서버를 배치하면 성능을 개선하고 사이트 보안을 훨씬 더 간단하게 만들 수 있습니다. Nginx를 설치하고 WebSSH에 대한 리버스 프록시 요청을 구성합니다. 즉, 사용자의 WebSSH 요청을 처리하고 다시 처리합니다.
패키지 목록을 새로 고친 다음 apt
를 사용하여 Nginx를 설치합니다.
- sudo apt update nginx
- sudo apt install nginx
ufw
방화벽을 사용하는 경우 이 시점에서 방화벽 구성을 일부 변경하여 기본 HTTP/HTTPS 포트인 80 및 443에 대한 액세스를 활성화해야 합니다. ufw
에는 다음 두 포트 모두에 대한 액세스를 제공하는 "Nginx Full\이라는 스톡 구성이 있습니다.
- sudo ufw allow “Nginx Full”
Nginx를 사용하면 sites-available/
이라는 하위 디렉토리의 개별 파일에 사이트별 구성을 추가할 수 있습니다. nano
또는 선호하는 텍스트 편집기를 사용하여 /etc/nginx/sites-available/webssh
에서 새 Nginx 구성을 만듭니다.
- sudo nano /etc/nginx/sites-available/webssh
다음을 새 구성 파일에 붙여넣고 your_domain
을 도메인 이름으로 바꾸십시오.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name your_domain www.your_domain
root /var/www/html;
access_log /var/log/nginx/webssh.access.log;
error_log /var/log/nginx/webssh.error.log;
location / {
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_read_timeout 300;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
}
listen 443 ssl;
# RSA certificate
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
# Redirect non-https traffic to https
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
이 구성에는 3개의 주요 "블록\이 있는 것으로 읽을 수 있습니다. location /
줄 앞에 오는 첫 번째 블록에는 기본 HTTP 포트 80에서 웹 사이트를 제공하기 위한 상용구 Nginx 구성이 포함되어 있습니다. . location /
블록에는 SSL을 유지하면서 내부적으로 포트 8888에서 실행되는 WebSSH로 들어오는 연결을 프록시하기 위한 구성이 포함되어 있습니다. location /
뒤의 파일 끝에 있는 구성 블록, LetsEncrypt SSL 키 쌍을 로드하고 HTTP 연결을 HTTPS로 리디렉션합니다.
파일을 저장하고 닫습니다. nano
를 사용하는 경우 Ctrl+X
를 누른 다음 메시지가 표시되면 Y
를 누르고 Enter를 누릅니다.
다음으로 이 새 구성을 활성화해야 합니다. Nginx의 규칙은 sites-available/
에 있는 파일에서 sites-enabled/
라는 다른 폴더로 심볼릭 링크(바로 가기와 같은)를 생성하여 활성화 또는 비활성화하는 것입니다. 명확성을 위해 전체 경로를 사용하여 해당 링크를 만듭니다.
- sudo ln -s /etc/nginx/sites-available/webssh /etc/nginx/sites-enabled/webssh
기본적으로 Nginx는 /etc/nginx/sites-available/default
에 다른 구성 파일을 포함하며 /etc/nginx/sites-enabled/default
에 연결되어 있습니다. 기본 인덱스 페이지. 새 WebSSH 구성과 충돌하기 때문에 /sites-enabled
에서 규칙을 제거하여 해당 규칙을 비활성화할 수 있습니다.
- sudo rm /etc/nginx/sites-enabled/default
참고: 이 튜토리얼의 Nginx 구성은 단일 애플리케이션인 WebSSH를 제공하도록 설계되었습니다. Nginx 설명서에 따라 동일한 서버에서 여러 애플리케이션을 제공하도록 이 Nginx 구성을 확장할 수 있습니다.
그런 다음 nginx -t
를 실행하여 Nginx를 다시 시작하기 전에 구성을 확인합니다.
- sudo nginx -t
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
이제 Nginx 서비스를 다시 시작할 수 있으므로 새 구성이 반영됩니다.
- sudo systemctl restart nginx
마지막으로 WebSSH에 직접 액세스하기 위해 이전에 생성한 방화벽 규칙을 제거할 수 있습니다. 이제 모든 트래픽이 표준 HTTP/HTTPS 포트를 통해 Nginx에 의해 처리되기 때문입니다.
- sudo ufw delete allow 8888
- sudo ufw delete allow 4433
명령줄에서 webssh
를 다시 시작합니다.
- wssh
Nginx가 이를 처리하므로 이번에는 인증서와 키 경로를 제공할 필요가 없습니다. 그런 다음 웹 브라우저에서 your_domain으로 이동합니다.
WebSSH는 이제 포트를 지정할 필요 없이 Nginx를 통해 HTTPS를 통해 제공됩니다. 이 시점에서 wssh
자체 실행을 제외한 모든 것을 자동화했습니다. 마지막 단계에서 그렇게 할 것입니다.
5단계 – (선택 사항) WebSSH용 Systemd 서비스 생성
백그라운드에서 자동으로 실행되지 않는 서버 측 애플리케이션 배포는 매번 명령줄에서 직접 시작해야 하므로 처음에는 직관적이지 않을 수 있습니다. 이에 대한 해결책은 자체 백그라운드 서비스를 설정하는 것입니다.
이렇게 하려면 서버의 초기화 시스템에서 사용할 수 있는 유닛 파일을 만들어야 합니다. 거의 모든 최신 Linux 배포판에서 초기화 시스템은 Systemd라고 하며 systemctl
명령을 사용하여 상호 작용할 수 있습니다.
WebSSH가 여전히 터미널에서 실행 중인 경우 Ctrl+C
를 눌러 중지합니다. 그런 다음 nano
또는 선호하는 텍스트 편집기를 사용하여 /etc/systemd/system/webssh.service
라는 새 파일을 엽니다.
- sudo nano /etc/systemd/system/webssh.service
유닛 파일에는 최소한 [Unit]
섹션, [Service]
섹션 및 [Install]
섹션이 필요합니다.
[Unit]
Description=WebSSH terminal interface
After=network.target
[Service]
User=www-data
Group=www-data
ExecStart=wssh
[Install]
WantedBy=multi-user.target
이 파일은 다음과 같이 분류할 수 있습니다.
-
[Unit]
섹션에는 새 서비스에 대한 일반 텍스트 설명과 시스템 시작 시 언제 실행되어야 하는지 지정하는After
후크가 포함되어 있습니다. 서버의 네트워킹 인터페이스가 나타났습니다. -
[Service]
섹션은 실제로 실행되어야 하는 명령과 실행해야 하는 사용자를 지정합니다. 이 경우www-data
는 Ubuntu 서버의 기본 Nginx 사용자이고wssh
는 명령 자체입니다. -
[Install]
섹션에는WantedBy=multi-user.target
줄만 포함되어 있으며의
섹션은 서버가 사용자 로그인을 수락할 준비가 되었을 때 서비스가 시작되도록 합니다.\nAfter
줄과 함께 작동합니다. [Unit]
파일을 저장하고 닫습니다. 이제 새 WebSSH 서비스를 시작
하고 부팅 시 자동으로 실행되도록 활성화
할 수 있습니다.
- sudo systemctl start webssh
- sudo systemctl enable webssh
systemctl status webssh
를 사용하여 성공적으로 시작되었는지 확인하십시오. 터미널에서 명령을 처음 실행했을 때와 유사한 출력을 받아야 합니다.
- sudo systemctl status webssh
Output● webssh.service - WebSSH terminal interface
Loaded: loaded (/etc/systemd/system/webssh.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-08-11 22:08:25 UTC; 2s ago
Main PID: 15678 (wssh)
Tasks: 1 (limit: 1119)
Memory: 20.2M
CPU: 300ms
CGroup: /system.slice/webssh.service
└─15678 /usr/bin/python3 /usr/local/bin/wssh
Aug 11 22:08:25 webssh22 systemd[1]: Started WebSSH terminal interface.
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 settings:125] WarningPolicy
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 main:38] Listening on :8888 (http)
이제 브라우저에서 https://your_domain
을 다시 로드할 수 있으며 WebSSH 인터페이스를 다시 가져와야 합니다. 이제부터 WebSSH와 Nginx가 서버와 함께 자동으로 다시 시작되고 백그라운드에서 실행됩니다.
결론
이 자습서에서는 웹 브라우저에서 명령줄 인터페이스를 제공하기 위한 휴대용 솔루션인 WebSSH를 설치했습니다. SSL을 추가한 다음 Nginx 리버스 프록시를 추가하고 마지막으로 WebSSH용 시스템 서비스를 생성하여 배포를 개선했습니다. 이것은 일반적으로 작은 서버 측 웹 애플리케이션을 배포하기에 좋은 모델이며 보안을 위해 키 쌍에 의존하는 SSH에 특히 중요합니다.
다음으로 SSH의 다른 연결 옵션에 대해 알아볼 수 있습니다.