Windows에서 Ubuntu 서비스를 실행하는 방법 (시작시)?


22

Windows 시작시 Linux 하위 시스템 (Windows의 Ubuntu의 Bash)에서 SSH 서버를 시작하려고합니다. 문제는 Bash 창이 닫힐 때 모든 Linux 프로세스가 종료된다는 것입니다.

bash 창없이 백그라운드에서 Linux 프로세스를 영구적으로 실행하는 방법이 있습니까?

답변:


26

aseering하여 그에 대한 자습서를 찾았습니다.

이것은 원래 github 사용자 imjakey, fpqc, qris, therealkenc, Manouchehri 및 aseering (myself)에 의해 논의되고 정렬되었습니다.

https://github.com/Microsoft/BashOnWindows/issues/612

sshd를 실행하면 보안에 영향을 미칩니다. WSL의 보안 모델이 더 오래 구워 질 때까지 Windows 수준으로 ssh 할 수있는 사람이라면 누구나 Linux 수준의 권한에 관계없이 sshd를 실행하는 Windows 사용자 권한으로 명령을 수행 할 수있는 권한이 있다고 가정해야합니다. (권한은 실제보다 제한적일 수 있지만 WSL의 초기 보안 모델은 그다지 정교하지 않습니다.)

github에서 지침을 집계하려고합니다.

  • sudo dpkg-reconfigure openssh-serverbash 쉘에서 실행 하여 SSH 호스트 키 생성
  • 실행 sudo nano /etc/ssh/sshd_config; UsePrivilegeSeparation yes읽을 행을 편집하십시오 UsePrivilegeSeparation no. ( WSL에서 현재 지원하지 않는 syscall을 UsePrivilegeSeparation사용 하기 때문에 필요 합니다 chroot().)
  • 여전히 편집하는 동안 /etc/ssh/sshd_config로 변경 PasswordAuthentication no하도록 선택할 수 있습니다 PasswordAuthentication yes. 그렇지 않으면 SSH 키를 설정해야합니다.
  • 저장 /etc/ssh/sshd_config하고 종료하십시오.
  • sudo visudosudoers 파일을 편집하려면 실행하십시오 . 라인 추가

    $USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D
    

    "$ USER"를 Linux 사용자 이름으로 바꾸십시오. 저장 및 종료. visudo가 변경 사항이 유효하지 않다고 불평하는 경우, 변경 사항이 유효하다고보고 될 때까지 수정하십시오. 그렇지 않으면 시스템에서 sudo를 깰 수 있습니다!

  • Windows 측에서는 포트 22에서 들어오는 트래픽을 허용하도록 Windows 방화벽 (및 실행중인 타사 방화벽)을 편집하십시오. 이는 초 보안 설정이 아니므로 집에서 들어오는 트래픽 만 허용하는 것이 좋습니다 ( 비공개) 및 도메인 네트워크 (공개 인터넷이 아닌).
  • 다음을 포함하는 텍스트 파일 autostartssh.vbs을 Windows에 작성하십시오 .

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • 스크립트를 두 번 클릭하십시오. sshd를 시작해야합니다. Windows 시스템으로 ssh 할 수 있어야합니다.
    • Windows 작업 스케줄러를 엽니 다. autostartssh.vbs시스템 부팅시 실행되는 작업을 추가하십시오 . wscript.exe실행할 명령으로 사용 하고 VBS 스크립트 위치를 매개 변수로 사용하십시오.

Windows 컴퓨터는 Linux openssh 서버를 실행해야합니다!


VBS 스크립트는 나를 위해 아무것도하지 않았습니다. 리소스 모니터 네트워크 탭에 sshd가 표시되지 않습니다.
megamaiku

프로세스 디스패처 github.com/131/dispatcher 를 작성 하여 창없이 bash를 생성 할 수 있습니다.
131

@ megamaiku : 나는 같은 문제가 있었다. "visudo"부분을 제대로 수행하지 않았기 때문에 sshd가 (보이지 않는) 암호 프롬프트에 갇히게되었습니다. 처음에는 sudoers 파일 중간에 NOPASSWD 줄을 추가했습니다. 바닥으로 옮기면 효과가있었습니다!
ltjax

1
sshd를 시작하기 전에 (권한 분리 디렉토리를 만들기 위해) UsePrivilegeSeparation = yes실행해야한다는 점을 제외하고는 현재 작업 중 sudo /bin/mkdir -p /var/run/sshd입니다. WLS는 이제 chroot ()를 지원합니까, openssh 소스에 해결 방법이 = No있습니까 , 아니면 설정이 안전 권장 사항에 더 가깝 습니까? 또한 Windows 작업은 사용자가 로그인 한 경우에만 작동하는 것 같습니다.
init_js

이것은 훌륭하게 작동했습니다. 더 쉽게하기 위해 SSH가 수신하는 포트 (예 : 3322)를 임의의 것으로 옮기십시오. /etc/ssh/sshd_config읽은 줄을 주석 처리 Port 22하고로 전환하십시오 Port 8822. 이것의 한 가지 이유는 22에서 일종의 SSH 프로세스를 실행하는 Windows입니다. 나는 그것을 비활성화하는 데 아무런 문제가 없다는 제안을 보았지만 WSL SSH 포트를 전환하는 것이 가장 쉽다는 것을 알았습니다.
knickum

4

나는 똑같은 일을해야했습니다.

다음은 Windows 부팅시 모든 cron 서비스를 사용하여 Ubuntu Linux 하위 시스템을 부팅하고 Linux 하위 시스템을 '재부팅'하는 방법을 제공하는 방법입니다.

서버에서 openssh-server, nginx & mariadb 데이터베이스를 성공적으로 호스팅하고 있습니다.

리눅스 서브 시스템 설치

  • 관리자 권한으로 Powershell 열기
  • 풀:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Windows 스토어에서 Ubuntu를 설치하십시오.

sudo 비밀번호 프롬프트 제거 (필수)

  • bash를여십시오 (Linux Subsystem이 이것을 설치합니다)
  • 풀:

    sudo sed -i "s/%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/g" /etc/sudoers
    

SSH 비밀번호 로그인 사용 (선택 사항)

  • bash 열기
  • 풀:

    sudo sed -i '/StrictModes yes/c\StrictModes no' /etc/ssh/sshd_config
    sudo sed -i '/ChallengeResponseAuthentication/c\ChallengeResponseAuthentication no' /etc/ssh/sshd_config
    sudo sed -i '/PasswordAuthentication/c\PasswordAuthentication yes' /etc/ssh/sshd_config
    

시작시 Windows 자동 로그인 (암호 또는 RDP가있는 경우 필수)

  • netplwiz 열기
  • '사용자는 사용자 이름과 비밀번호를 입력해야합니다 ...'
  • 관리자로 regedit 열기
  • 찾아보기

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • 새 문자열 DefaultPassword을 작성하고 사용자 비밀번호를 값으로 작성하십시오.

시작시 bash / cron 루프를 실행하십시오.

  • linux.bat에서 불러 온 파일 만들기shell:startup
  • 풀:

    C:\Windows\System32\bash.exe -c 'while [ true ]; do sudo /usr/sbin/cron -f; done'
    

cron에서 시작할 앱 / 서비스 추가

  • bash 열기
  • sudo crontab -e
  • nano 또는 저장 방법을 알고있는 편집기를 선택하십시오.
  • openssh-server, nginx, mysql, php와 같은 시작 앱 추가 :

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    @reboot . $HOME/.profile; /usr/sbin/sshd -D
    #@reboot . $HOME/.profile; service php7.1-fpm start # Uncomment for php7.1 fpm
    #@reboot . $HOME/.profile; service mysql start # Uncomment for mysql/mariadb
    #@reboot . $HOME/.profile; service nginx start # Uncomment for nginx
    
  • 저장하고 종료 : ctrlx, 다음 Enter 키를 눌러 yenter.

Windows를 재부팅하지 않고 Linux 서브 시스템을 재부팅하십시오.

  • bash 또는 SSH 열기

    sudo service ssh restart
    
  • 현재 인스턴스를 닫고 cron을 적용하여 새 인스턴스를 만듭니다.

추가-PHP 7.1 설치 (정확하지는 않음)

  • 표준 설치를 위해 아래 명령을 실행하십시오.

    mkdir /run/php && chmod -R 777 /run/php
    sudo add-apt-repository ppa:ondrej/php && sudo apt update
    PHPV=7.1 && sudo apt install --allow-unauthenticated -y php${PHPV}-fpm php${PHPV}-gd php${PHPV}-json php${PHPV}-mysqlnd php${PHPV}-curl php${PHPV}-intl php${PHPV}-mcrypt php${PHPV}-imagick php${PHPV}-zip php${PHPV}-xml php${PHPV}-mbstring
    
  • 'OwnCloud'설정을 위해 아래 명령을 실행하십시오.

    PHPV=7.1 && apt install --allow-unauthenticated -y php${PHPV}-redis redis-server php${PHPV}-ldap php${PHPV}-smbclient
    

추가-nginx 웹 서버 설치

  • PHP7.1로 기본 설정을 위해 아래 명령을 실행하십시오 :

    sudo add-apt-repository ppa:nginx/stable
    sudo apt update && sudo apt -y install nginx
    sudo sed -i 's:access_log /var/log/nginx/access.log;:access_log off;:g' /etc/nginx/nginx.conf
    sudo sed -i '/index index.html/c\\tindex index.html index.php index.htm index.nginx-debian.html;' /etc/nginx/sites-available/default
    STR='}\n\n\tlocation ~ \.php$ {\n\t\tinclude snippets\/fastcgi-php.conf;\n\t\tfastcgi_pass unix:\/var\/run\/php\/php7.1-fpm.sock;\n\t}'
    sudo sed -i "0,/}/s//$STR\n/" /etc/nginx/sites-available/default
    sudo service nginx restart
    

추가-mariadb의 mysql 데이터베이스 설치

  • mysql 데이터베이스 서버에 대해 아래 명령을 실행하십시오.

    RELEASE=`lsb_release -a | tail -1 | cut -f2`
    sudo apt install software-properties-common
    sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
    sudo add-apt-repository "deb [arch=i386,amd64,ppc64el] https://mirrors.evowise.com/mariadb/repo/10.3/ubuntu $RELEASE main"
    sudo apt update && sudo apt --allow-unauthenticated -y install mariadb-server
    
  • 프롬프트가 표시되면 루트 데이터베이스 사용자 비밀번호를 설정하십시오.


매우 영리합니다! 정확한 지침 덕분입니다. "sudo"비밀번호를 완전히 건너 뛰는 것을 피할 수있는 방법이 있습니까?
greg

더 이상 Linux 하위 시스템을 사용하지 않는 것이 좋습니다. 응용 프로그램 호환성이 빨라지고 불안정하며 도구가 모두 제대로 작동하지는 않습니다-bash 통합 등. 대신 msys2를 사용하면 훌륭한 bash 셸을 제공하고 응용 프로그램을 통해 많은 응용 프로그램을 설치할 수 있습니다 pacman package manager-무엇보다도 모든 앱은 .exe입니다. bin 디렉토리를 Windows의 환경 변수에 추가하기 만하면됩니다. Windows에서 Linux 명령을 사용하고 그 반대도 마찬가지입니다. 모든 Windows 스크립팅은 bash에서 수행됩니다.
Nom

1

@ poma의 대답은 매우 좋으며 내 대답의 기반이됩니다. 그래도 개선 사항을 추가하고 싶습니다.

  • 사용 service하는 대신 호출하는 sshd직접 : 'sudo service ssh start'대신 'sudo /usr/sbin/sshd -D'. 이렇게하면 스크립트를 여러 번 호출하더라도 최대 하나의 sshd프로세스 만 있습니다 . 또한를 실행하는 다른 스크립트로 쉽게 죽일 수 'sudo service ssh stop'있습니다. sudoers 파일에서 간단히로 바꿔야 /usr/sbin/sshd -D합니다 /usr/sbin/service.
  • 직접 호출 하도록 설정된 경우 프로세스를 무한정 포 그라운드로 배치하므로 옵션을 제거하십시오 . 당신이 나를 믿지 않는다면, 그냥 그렇게 하면 스크립트를 호출 할 때마다 프로세스 와 프로세스 가 표시 됩니다. sudoers 파일에서 옵션 을 제거하는 것을 잊지 마십시오 !sshd-Dtopinitsudo-D
  • VBS 대신 PowerShell 을 사용하십시오 ! 라는 파일을 작성 autostartsshd.ps1하고 다음에 붙여 넣습니다 bash -c 'sudo service ssh start'. 스크립트를 실행하려면 마우스 오른쪽 버튼을 클릭하고을 클릭하십시오 Run with PowerShell.

또 다른 스택 오버플로 질문에는 비슷한 단계가 있습니다. /superuser//a/1114162/182590

누군가를 돕는 희망 :)


이것이 효과가 있습니까? 포 그라운드에서 sshd를 실행하는 것은 bash 세션을 열린 상태로 유지하기위한 것입니다 (중복이 시작되지 않기 때문에 여러 인스턴스에는 문제가 없습니다). 방금 실행 sudo service ssh start한 다음 bash를 닫으면 ssh 데몬이 종료됩니다. 적어도 그것은 내 가이드를 쓰는 순간에 그랬습니다.
Poma

@Poma Windows 10의 최신 업데이트로 Linux 응용 프로그램을 백그라운드에서 실행할 수 있으므로 제대로 작동한다고 생각합니다.
JacobTheDev

1

bash -c "echo [password] | service ssh start"Windows 시작 스크립트에 넣고 자신의 sudo 비밀번호를 사용하여 [password]


암호를 sudo 프롬프트로 파이프 할 수는 없습니다 (명령에 sudo문장에 필요한 필수 키워드가 포함되어 있지는 않음 ). 이것은 작동하지 않습니다. 어쨌든 비밀번호를 일반 텍스트로 저장해서는 안됩니다!
adam_0

1

@Poma와 @Hintron의 답변은 훌륭합니다.

몇 가지 옵션을 전환해야하므로 Windows 작업 스케줄러에서 ssh 작업을 추가하는 방법에 대한 마지막 요점에 대한 설명을 확장하고 싶습니다.

  • "작업 스케줄러"를 실행하십시오. 왼쪽 목록에서 "작업 스케줄러 (로컬)"를 선택한 다음 "작업"메뉴 및 "작업 만들기"로 이동하십시오.
  • 일반 탭 :
    • 이름 : "ssh"
    • "사용자 로그온 여부에 관계없이 실행"을 선택하십시오.
  • 트리거 탭 :
    • 새로운
      • "시작할 때"작업을 시작하십시오.
  • 작업 탭 :
    • 새로운
      • 프로그램 / 스크립트 : C : \ Windows \ System32 \ bash.exe
      • 인수 추가 (선택 사항) : -c "sudo / usr / sbin / service ssh start"
  • 정황:
    • "컴퓨터가 AC 전원에 연결된 경우에만 작업 시작"을 선택 취소하십시오.
  • 설정
    • "작업이 오래 실행되는 경우 작업 중지

직접 bash 호출이 사용됩니다. vbs 또는 powershell 스크립트로 랩핑 할 필요가 없습니다.

@Hintron이 설명 한 이유로 서비스 명령을 사용합니다. 또한 직접 sshd 호출로 오류가 발생합니다

권한 분리 디렉토리 누락 : / var / run / sshd

이 경우 sudo visudo명령 으로이 항목을 추가해야합니다.

ALL ALL = (root) NOPASSWD: /usr/sbin/service ssh *

또한 여기에서 모든 사용자 (첫 번째 열)가 sshd를 시작하거나 중지 할 수 있습니다. 이 Windows 시스템 사용자가 한 명인 경우에는 문제가 없습니다.


1
  1. 다음 wsl_setup.bat과 같이 이름이 지정된 파일을 작성하고 컨텐츠를 추가하십시오.

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. wsl_setup.batWindows 시작 폴더에 파일 추가 windows-10-change-startup-apps

  3. Windows 계정을 다시 시작하고 로그인하십시오 (예, 로그인해야 함)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.