<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Reimu's Development Blog</title>
    <link>https://hakurei.tistory.com/</link>
    <description>Front-End, Back-End, Database, Travel</description>
    <language>ko</language>
    <pubDate>Mon, 15 Jun 2026 04:52:58 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Reimu.</managingEditor>
    <image>
      <title>Reimu's Development Blog</title>
      <url>https://t1.daumcdn.net/cfile/tistory/256B273F575AE35F28</url>
      <link>https://hakurei.tistory.com</link>
    </image>
    <item>
      <title>[pywin32] Python을 이용한 비활성 Window에 Key 이벤트 보내기</title>
      <link>https://hakurei.tistory.com/318</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 플레이하는 게임마다 간단하게 매크로를 하나씩 만들어보고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 잘 써먹던 Autohotkey 같은 경우, 워낙 많이 알려져있기 때문에 PC 클라가 뜨면서 보안프로그램이 같이 떠버리면 어뷰저 (악용 유저)로 분류가 되기 마련이다. (N사 게임들이 특히 그렇다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 게임사도 win32 API인 SendMessage, PostMessage는 막을 수가 없기 때문에, 이것들을 활용해보았고, 그 결과 잘 되는 것을 확인하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 못막냐고? 저것들을 막아버리면 PC 클라로 들어오는 모든 이벤트를 막는 것이기 때문에, 일반적인 키보드 / 마우스도 사용할 수가 없기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 C로 쌩짜로 짜면 좋겠지만, 간단하게 python으로 구현을 해보았고, win32gui, win32con 패키지 정도만 있으면 쉽게 구현가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 하는 게임에서 필요한 기능은 자동 사냥은 일단 제공을 하고 있고, 자동 스킬까지 제공하는 훌륭한 게임이지만, 일정주기마다 특정 키를 눌러줘야 자동 사냥의 효율성이 더 올라가고, 물약도 적게 먹기 때문에, 난 30초마다 내가 숨겨둔 PC클라에 특정 키를 입력해주는 기능을 구현하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 소스는 내가 플레이하는 게임창을 찾아서, 특정 시간마다 Z 키를 누르는 기능을 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1659266991441&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import time
import win32gui
import win32con

class DiabloByebye:

    def __init__(self):        
        self.win_title_name = &quot;찾고자 하는 창의 타이틀명 적어준다. (winspy로 찾을 수 있음)&quot;
        self.handle = win32gui.FindWindow(None, self.win_title_name)
        print(self.handle) # 여기서 0 찍히면 타이틀명 잘못 찾은거임
        
    def start(self):
        while True:                        
            win32gui.SendMessage(self.handle, win32con.WM_KEYDOWN, ord('Z'), 0)
            time.sleep(0.1)
            win32gui.SendMessage(self.handle, win32con.WM_KEYUP, ord('Z'), 0)
            time.sleep(30)
 
if __name__== &quot;__main__&quot;:  
    DiabloByebye().start()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스명은 최근 영정당한 Diablo에게 인사하는 이름으로 해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키보드 이벤트를 후킹해서, 시작 / 중지 / 종료 등도 다양하게 구현이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/Python</category>
      <category>win32con</category>
      <category>win32gui</category>
      <author>Reimu.</author>
      <guid isPermaLink="true">https://hakurei.tistory.com/318</guid>
      <comments>https://hakurei.tistory.com/318#entry318comment</comments>
      <pubDate>Sun, 31 Jul 2022 20:32:09 +0900</pubDate>
    </item>
    <item>
      <title>[AutoHotkey] 디아블로 이X탈 매크로 만들기</title>
      <link>https://hakurei.tistory.com/317</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;사실 조용히 쓰고 있었고, 다른 사람보다 열심히 쓰진 않았다고 생각하는데 영구정지를 당한김에, 개발 블로그에 AutoHotkey로 매크로를 만드는 법에 대해 안내해보려고 한다. (어찌됐든 AutoHotkey도 개발의 일종이다! 사실 더 많이 쓴 사람은 영정 안시키고, 내가 당해서 열받은 것도 쪼끔있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 AutoHotkey란, Windows에서 사용되는 Click이라던지 Mouse 이동이라던지 사용자가 GUI 환경에서 손으로 할 수 있는 모든 동작들을 예약된 간단한 명령어를 이용하여 컴퓨터가 동작시킬 수 있도록 하는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에, 프로그래밍 경험이 없는 사람들도 눈치만 있으면, 간단한 자동 클릭 매크로 정도는 만들 수 있고, 프로그래밍 업계에서 일했던 사람이라면, 창이 완전히 내려가 있는 상태에서도 사람이 누르는 것처럼 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능이 워낙 많기 때문에, 내가 만들었던 로직에 대해 간단히 설명과 주석을 달아둘거고, 그 외 응용은 아래 홈페이지를 참고하면 간단히 업그레이드 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.autohotkey.com/docs/AutoHotkey.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.autohotkey.com/docs/AutoHotkey.htm&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657281467748&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Quick Reference | AutoHotkey&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.autohotkey.com&quot; data-og-source-url=&quot;https://www.autohotkey.com/docs/AutoHotkey.htm&quot; data-og-url=&quot;https://www.autohotkey.com/docs/AutoHotkey.htm&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.autohotkey.com/docs/AutoHotkey.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.autohotkey.com/docs/AutoHotkey.htm&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Quick Reference | AutoHotkey&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.autohotkey.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인이 메테오 법사를 했어서, 그거에 특화되게 만들어봤으니 응용해서 쓰길 바라고, 소스 짠 다음에 컴파일은 구글링 조금만 해봐도 아주 쉬워서 따로 안내 안함&lt;/p&gt;
&lt;pre id=&quot;code_1657282099150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Gui, Add, Button, x10 y20 w100 h30 gStart, 시작   ; 창에 시작 버튼 표시하고, 클릭 시 Start: 이후에 명령어를 실행한다.
Gui, Add, Button, x120 y20 w100 h30 gStop, 중지   ; 창에 중지 버튼 표시하고, 클릭 시 Stop: 이후에 명령어를 실행한다.
Gui, Show, w240 h80, Dia   ; Gui를 통해 그린 버튼들을 화면에 보여준다. 240*80 크기로
return ; 구문 한 묶음 당 필수 구문이니 넣어주도록 하자.

GuiClose:      ; 창 닫았을 때 동작하는 Event 
ExitApp        ; 난 창 닫았을 때 매크로가 종료되도록 하고 싶어서, 이 구문을 넣었다.

Start:         ; 시작 버튼 눌렀을 때 이리로 온다.
Settimer, potion, 60000, On, 1     ; 포션 빠는거 60000ms (60초) 마다 1순위로 실행하게 할거임
Settimer, skill_meteor, 10000, On, 2  ; 메테오는 10초마다 2순위로 실행하게 할거임
Settimer, skill_3, 7000, On, 3  ; 스킬 3번 버튼은 7초마다 3순위로 쓰고 싶어

Loop        ; 반복문 : 스킬만 쓰면 캐릭터가 멍하니 서서 스킬만 쓰니까, 0.3초마다 평타 치고 싶어 (난 평타를 z로 설정했는데, 다른 키면 바꿔도 돼)
{	
	ControlSend,, {shift down}z{shift up}, Diablo Immortal	 ; 시프트 누르고 z 누르고 시프트 풀어, Diablo Immortal 창 이름을 가진 곳에서
	sleep, 300  ; 이 구문이 없으면 컴퓨터가 뻗을 수 있으니, 0.3초 쉬면서 반복하자
}
return  ; 이벤트 구문 하위에 넣어주자

Stop:    ; 중지 버튼 눌렀을 때 이리로 온다.
Pause    ; 모든 동작 중지해
return   ; 이벤트 구문 하위에 넣어주기

potion:  ; 포션 동작 이벤트 구문
ControlSend,, q, Diablo Immortal    ; q를 누를건데, Diablo Immortal 이라는 창에서 누를거야
return   ; 이벤트 구문 하위에 넣어주기

skill_meteor:   ; 메테오 이벤트 구문
Critical       ; 메테오는 동작이 길어서, 이 구문을 넣어주어야 다른 동작에 영향을 받질 않아
ControlSend,, 4, Diablo Immortal   ; 4번 버튼에 있는 갑옷 시전해
sleep, 1000   ; 다음에 2번에 넣어둔 메테오 시전할거고, 너무 빨리 누르면 키가 씹히니까 1초 쉬어
ControlSend,, 2, Diablo Immortal ; 2번 버튼에 넣어둔 메테오 시전해
sleep, 1000   ; 마찬가지로 1초 쉬었다가 비전바람 쓸거야
ControlSend,, 1, Diablo Immortal  ; 1번에 넣어둔 비전바람으로 메테오 쓴 곳에 불 질러
sleep, 1000   ; 마찬가지로 1초 쉬었다가 비전바람 한 번 더 쓸거야
ControlSend,, 1, Diablo Immortal  ; 1번에 넣어둔 비전바람으로 메테오 쓴 곳에 불 질러
return   ; 이벤트 구문 하위에 넣어주기

skill_3:     ; 이거 번개 파장? 이었나 영정돼서 기억이 안나는데 그 퍼졌다가 돌아오는 스킬이야
ControlSend,, 3, Diablo Immortal   ; 3번 버튼 눌러
return ; 이벤트 구문 하위 기억하지?


F8::     ; 매크로 창에 시작 버튼이 있지만, 직접 누르기 귀찮아, F8로 실행 가능하도록 넣은 구문
Goto, Start   ; Start: 이후 구문 실행할거야
return    ; 이것도 이벤트 구문 하위니까 return 넣자

F9::    ; 중지도 직접 누르기 귀찮아, F9로 실행되도록 넣자
Pause   ; 모든 동작 중지, 다시 한 번 누르면 재개
return  ; 이벤트 구문 하위

F10::   ; 이거 우리 불멸단이라 금고 가려면 광클 필요해, 그래서 F10누르면 광클되게 해봤어
while GetKeyState(&quot;F10&quot;, &quot;T&quot;)   ; F10 누르면 왼쪽 마우스 버튼을 커서 위치에서 0.01초마다 눌러!, 다시 누르면 중지해
{
    MouseClick, left
	sleep, 10
}
return ; 이벤트 구문 하위야

F12::   ; F12로도 종료할 수 있어
ExitApp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 이거 앱 플레이어가 아니고, 배틀넷 런처의 PC 버전에서 비활성화 형태로 동작하지만, 구조상 마우스까지 후킹할 순 없어서, 마우스는 위치해둬야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(매크로는 마우스 커서 위치 기준으로 동작한다고 보면 되고, 듀얼 모니터 쓰는 사람은 슬쩍 옆 모니터로 커서 넘기면, 돌리면서 다른 거 할 수 있음, 비활성 윈도우 이벤트의 묘미)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퍼갈땐 꼭 댓글로 출처 명시해주길 바라고, 궁금한 점은 댓글 달아주면 확인 가능한 시간에 답변 드림&lt;/p&gt;</description>
      <category>개발</category>
      <category>디아블로</category>
      <category>디아블로이모탈</category>
      <category>매크로</category>
      <category>오토핫키</category>
      <category>이모탈</category>
      <category>이모탈매크로</category>
      <author>Reimu.</author>
      <guid isPermaLink="true">https://hakurei.tistory.com/317</guid>
      <comments>https://hakurei.tistory.com/317#entry317comment</comments>
      <pubDate>Fri, 8 Jul 2022 21:13:38 +0900</pubDate>
    </item>
    <item>
      <title>[Technitium] docker를 이용한 DNS서버 구축</title>
      <link>https://hakurei.tistory.com/316</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주에 단자함에 공유기 하나를 넣음으로써, 드디어 홈 네트워크가 완성되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 우리 집의 IPTV를 제외한 모든 장비는 공유기 하나에서 DHCP로 내려주는 Private IP로 유/무선 모두 접근이 가능해졌는데, DNS의 경우 무료 DNS인 duckdns.org를 가져다 쓰고 있었고, 결국 NAT IP타고 내부 네트워크로 들어오기 때문에, 현재 상황은 도메인으로 접근 시 내부 -&amp;gt; 외부 -&amp;gt; 내부와 같이 비효율적인 통신 환경이 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS 쿼리 시에도 private ip를 가져올 수 있도록 하려면, 공유기에 자체 구축한 DNS 서버를 연결하면 해결이 된다. 물론 장비가 많지 않은 경우면 그냥 개별 장비에 hosts에 박아서 쓰면 되지만, 완벽한 방법은 아니라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론으로 DNS 서버 구축을 위해 여러 솔루션들을 찾아봤는데, Technitium 이라는 DNS 서버가 간단하게 docker image 올리고, config 정도만 volume으로 연결해두면, Admin 페이지를 통해 각종 세팅을 할 수 있도록 제공을 하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker hub에서도 100개가 넘는 STAR를 받았고, 업데이트도 자주 해주어서, 이걸로 해보는 것으로 결정!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hub.docker.com/r/technitium/dns-server&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hub.docker.com/r/technitium/dns-server&lt;/a&gt; 에 작성된 README를 읽다보면, docker 설치 방법에 친절하게 docker-compose.yml까지 제공을 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1649312696651&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - TechnitiumSoftware/DnsServer: Technitium DNS Server&quot; data-og-description=&quot;Technitium DNS Server. Contribute to TechnitiumSoftware/DnsServer development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml&quot; data-og-url=&quot;https://github.com/TechnitiumSoftware/DnsServer&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dRp8JD/hyNXpQ1uMe/zQUXz7Zs3bU8ztWCom4uCk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dRp8JD/hyNXpQ1uMe/zQUXz7Zs3bU8ztWCom4uCk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - TechnitiumSoftware/DnsServer: Technitium DNS Server&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Technitium DNS Server. Contribute to TechnitiumSoftware/DnsServer development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그대로 복붙하면, 컨테이너가 뜨고, 5380 포트로 admin 페이지에서 이것저것 세팅을 조정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인 같은 경우는, duckdns.org 관련 도메인을 입력하면 사설 IP가 반환되기를 원했기 때문에, 아래와 같이 ZONE을 먼저 추가를 해주었고, A 레코드만 사설 IP로 입력하여 사용하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nlQFB/btryHaCyUdH/Ytkke2Kmf0EjAyshhZKd70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nlQFB/btryHaCyUdH/Ytkke2Kmf0EjAyshhZKd70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nlQFB/btryHaCyUdH/Ytkke2Kmf0EjAyshhZKd70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnlQFB%2FbtryHaCyUdH%2FYtkke2Kmf0EjAyshhZKd70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1164&quot; height=&quot;470&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8VZt6/btryJu7Ehyz/sUCXj4QZbkpe6XEqjeb5aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8VZt6/btryJu7Ehyz/sUCXj4QZbkpe6XEqjeb5aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8VZt6/btryJu7Ehyz/sUCXj4QZbkpe6XEqjeb5aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8VZt6%2FbtryJu7Ehyz%2FsUCXj4QZbkpe6XEqjeb5aK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;86&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 공유기의 WAN 설정 쪽으로 가서 DHCP에 지금 세팅한 DNS 서버의 IP를 넣어주면, 유 / 무선 기기에 DNS 쿼리 시 지금 세팅한 DNS 서버를 바라보게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(DNS 서버 구축 한 장비가 원격에 있는 경우 53번 포트 TCP / UDP를 열어야 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;router.asus.com도 가끔 오락가락 하길래, 192.168.0.1로 아예 박아넣었더니 이후에 못찾는 일이 없어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무 환경에서도 써먹으면 좋을만한 &lt;b&gt;Technitium&lt;/b&gt; 추천!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 DNS 쿼리가 잘 안되는 분들을 위해.. 일반적인 DNS 같은 경우 3600초를 Default로 TTL (캐싱으로 이해하면 쉬움)이 지정되어 있어서, 즉시 이용이 필요한 경우 아래와 같은 방법으로 DNS를 Flush 해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Windows&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd창을 열고 ipconfig /flushdns를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MAC&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널을 열고, sudo dscacheutil -flushcache;sudo killall -HUP mDNSResponder 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모바일 기기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wifi off후 on하고 다시 연결&lt;/p&gt;</description>
      <category>개발/Linux, System</category>
      <category>dns</category>
      <category>technitium</category>
      <author>Reimu.</author>
      <guid isPermaLink="true">https://hakurei.tistory.com/316</guid>
      <comments>https://hakurei.tistory.com/316#entry316comment</comments>
      <pubDate>Thu, 7 Apr 2022 15:31:17 +0900</pubDate>
    </item>
    <item>
      <title>[Plex] 설치 후 초기 setup 페이지로 이동 불가한 현상을 SSH Tunneling으로 해결하기</title>
      <link>https://hakurei.tistory.com/315</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 Oracle Cloud의 서울 리전에 드디어 인스턴스 생성을 완료해서, Plex Media Server를 설치하고, 구글 드라이브와 연동을 해서 어디서든 스트리밍할 수 있는 환경을 만들어보기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마침 지난 번 우회 결제로 Life Time Pass도 있는 상태라, 그 계정에 서버를 붙이기만 하면 되는 상황이라 Plex Media Server 설치를 먼저했고, 로그인을 했는데 자꾸 새로 설치한 Plex 셋업 페이지로는 가지 않고, 기존 Plex 서버로만 리다이렉션이 되어, 서버를 추가할 수가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 그런가 구글링을 좀 해보니.. 동일 네트워크에서 Plex를 이용한 이력이 있는 경우 이슈가 되는 거라고 했다. (사실 이해는 좀 안됨..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결책을 찾아보니, Plex Port (32400)를 SSH 터널링을 이용해서 다른 포트로 로컬 포트에 띄워서, 접근하면 다른 네트워크로 인식되어, 세팅에 이슈가 없다고 하더군..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 절차로 따라해보기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 오라클 클라우드에 SSH 접근을 하려면, private key가 필요하니 로컬에 준비해두도록 하고, 일반적으로 Windows 환경에서 SSH 명령어를 기본 지원하진 않으므로, Git bash도 설치해서 준비해주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비가 끝났으면, Git bash를 열고 아래와 같은 키워드로 터널링을 해주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어는 원격 서버에 SSH로 붙어 있는 동안, 원격 서버에 떠있는 32400 포트를 로컬 환경에서 8888 포트로 붙게 해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1643633166999&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ssh -i ssh-key.key ubuntu@서버 IP -L 8888:localhost:32400&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해두고, http://localhost:8888로 붙어주면, 동일하게 로그인 절차를 거치지만 Plex Media Server의 Setup 절차로 이동할 수 있게 되고, 기존에 사용하던 Plex계정인 경우 서버가 하나 추가되어, Plex 계정 하나로 여러개의 Plex Media Server를 관리할 수 있게 된다!&lt;/p&gt;</description>
      <category>NAS/plex</category>
      <category>PLEX</category>
      <category>SSH Tunnel</category>
      <author>Reimu.</author>
      <guid isPermaLink="true">https://hakurei.tistory.com/315</guid>
      <comments>https://hakurei.tistory.com/315#entry315comment</comments>
      <pubDate>Mon, 31 Jan 2022 21:48:03 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] rtcwake 와 wol을 이용한 전기세 관리</title>
      <link>https://hakurei.tistory.com/314</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;최근 뭐때문인진 모르겠지만, 갑자기 전기세가 많이 나오고 있어서, 집에서 관리중인 서버도 자는 시간에는 rtcwake를 이용하여 절전모드로 해두고, 혹시나 긴급하게 봐야할 경우에는 wol을 이용하여 제어하는 것으로 계획을 세웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;rtcwake&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자는 시간이 00시부터 08시정도 이므로, 자정에 8시간동안만 절전을 활성화하면 되기 때문에 crontab을 사용하면 된다.&lt;/li&gt;
&lt;li&gt;0 0 * * * /usr/sbin/rtcwake -m mem -s 28800&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;wol (wake on lan)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일단 서버가 연결되어 있는 공유기에서 wol을 지원해야 하고, 랜카드에서도 wol을 지원하는지 확인해야 한다.&lt;/li&gt;
&lt;li&gt;공유기는 모델명을 확인하여, 각 제조사 사이트에서 찾아봐야 하며, 랜카드의 경우 하드웨어에서는 지원한다고 해도, OS단에서 disable 되어 있는 경우가 있다.&lt;/li&gt;
&lt;li&gt;먼저 ifconfig 를 이용하여, 내 랜카드가 어떤 것인지 확인하고, ethtool 명령어를 아래와 같이 입력하여 wol이 설정되어 있는지 본다. 아래에서는 enp3s0이 내 랜카드라고 가정하였고, wol을 지원하고 있다면, Wake-on 란이 g 일것이고, 지원하지 않으면 d일 것이다.)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;pre id=&quot;code_1637887268867&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ /sbin/ethtool enp3s0 

#
Settings for enp3s0:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Supported pause frame use: Symmetric Receive-only
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Advertised pause frame use: Symmetric Receive-only
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Link partner advertised link modes:  10baseT/Half 10baseT/Full 
                                             100baseT/Half 100baseT/Full 
                                             1000baseT/Half 1000baseT/Full 
        Link partner advertised pause frame use: No
        Link partner advertised auto-negotiation: Yes
        Link partner advertised FEC modes: Not reported
        Speed: 1000Mb/s
        Duplex: Full
        Port: MII
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00000033 (51)
                               drv probe ifdown ifup
#&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;만약 Wake-on이 d로 되어 있다면 아래 명령어로 활성화 후 다시 확인해본다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;pre id=&quot;code_1637886881977&quot; class=&quot;shell&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ /sbin/ethtool -s enp3s0 wol g&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다만, 이렇게 명령어로 설정한 경우 재부팅 시에는 적용이 되지 않기 때문에, /etc/network/interface 파일을 열어서 두 줄을 추가해주어야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;pre id=&quot;code_1637887147295&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ vi /etc/network/interface

# 가장 하단에 아래 두 줄 추가
post-up /sbin/ethtool -s enp3s0 wol g
post-down /sbin/ethtool -s enp3s0 wol g&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/Linux, System</category>
      <category>rtcwake</category>
      <category>WOL</category>
      <author>Reimu.</author>
      <guid isPermaLink="true">https://hakurei.tistory.com/314</guid>
      <comments>https://hakurei.tistory.com/314#entry314comment</comments>
      <pubDate>Fri, 26 Nov 2021 09:39:35 +0900</pubDate>
    </item>
    <item>
      <title>[OSX] SIP와 관련된 이슈</title>
      <link>https://hakurei.tistory.com/313</link>
      <description>&lt;p&gt;우선 아래의 블로그에서 많은 도움을 받았다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://lifeinprogram.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;lifeinprogram.tistory.com/18&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1619689095108&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MacOS에서 시스템 폴더에 접근하기 / 시스템 무결성 보호(SIP)/ Operation not permitted / csrutil disable / csru&quot; data-og-description=&quot;MacOS 에서 시스템 폴더에 접근하여 파일을 생성하거나 디렉토리를 만들려고 하니&amp;nbsp;&amp;quot;Operation not permitted&amp;quot; 라는 메세지가 뜨면서 실행이 안됩니다. MacOS 에서 시스템 폴더에 접근하여 파일을 생성하&quot; data-og-host=&quot;lifeinprogram.tistory.com&quot; data-og-source-url=&quot;https://lifeinprogram.tistory.com/18&quot; data-og-url=&quot;https://lifeinprogram.tistory.com/18&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Z2hu8/hyJ2sq91PU/KGOOgPtlaiUoRBLd8pHuPK/img.png?width=800&amp;amp;height=500&amp;amp;face=0_0_800_500,https://scrap.kakaocdn.net/dn/bZmRp2/hyJ2mLb2Ik/73E5wr3L1cDqkkj3M1nI9k/img.png?width=800&amp;amp;height=500&amp;amp;face=0_0_800_500,https://scrap.kakaocdn.net/dn/gZj4z/hyJ2i9UOHP/oW9BOIuhqzaybN3M684Lz0/img.png?width=1848&amp;amp;height=994&amp;amp;face=0_0_1848_994&quot;&gt;&lt;a href=&quot;https://lifeinprogram.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lifeinprogram.tistory.com/18&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Z2hu8/hyJ2sq91PU/KGOOgPtlaiUoRBLd8pHuPK/img.png?width=800&amp;amp;height=500&amp;amp;face=0_0_800_500,https://scrap.kakaocdn.net/dn/bZmRp2/hyJ2mLb2Ik/73E5wr3L1cDqkkj3M1nI9k/img.png?width=800&amp;amp;height=500&amp;amp;face=0_0_800_500,https://scrap.kakaocdn.net/dn/gZj4z/hyJ2i9UOHP/oW9BOIuhqzaybN3M684Lz0/img.png?width=1848&amp;amp;height=994&amp;amp;face=0_0_1848_994');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;MacOS에서 시스템 폴더에 접근하기 / 시스템 무결성 보호(SIP)/ Operation not permitted / csrutil disable / csru&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;MacOS 에서 시스템 폴더에 접근하여 파일을 생성하거나 디렉토리를 만들려고 하니&amp;nbsp;&quot;Operation not permitted&quot; 라는 메세지가 뜨면서 실행이 안됩니다. MacOS 에서 시스템 폴더에 접근하여 파일을 생성하&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;lifeinprogram.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;관리하는 Mac이 Ruby / Gem으로 패키지를 관리하는데, gem install / bundle update 든 하려고 하면, 계속 /usr/bin 하위에 권한이 없다고 뱉어내는 현상이 있어서, 일단 가장 먼저 찾아지는 SIP를 Recovery Mode로 진입해서 꺼보았다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그런데도 뭔가 해결이 안되는 느낌이 있었는데, mount를 이용해서 Write 권한까지 주어야 하는 것인줄은.. 저 블로그에서 알게되었음.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이거 한줄로 모든게 해결이 되었다.&lt;/p&gt;
&lt;p&gt;$ sudo mount -uw /&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;왠지 그동안 문제 있던 것들도 다 이 문제가 아니었나 싶을 정도로, 업데이트 / 설치 모두 깔끔!&lt;/p&gt;
&lt;p&gt;xcode를 이용한 빌드 때문에 쓰는거지.. 정말 MAC은 서버용으로는 적합하진 않은 것 같다.&lt;/p&gt;</description>
      <category>개발/Linux, System</category>
      <category>sip</category>
      <author>Reimu.</author>
      <guid isPermaLink="true">https://hakurei.tistory.com/313</guid>
      <comments>https://hakurei.tistory.com/313#entry313comment</comments>
      <pubDate>Thu, 29 Apr 2021 18:41:02 +0900</pubDate>
    </item>
    <item>
      <title>[OSX] ssh포트가 먹통일 경우 임시 해결책</title>
      <link>https://hakurei.tistory.com/312</link>
      <description>&lt;p&gt;회사에 보안프로그램이 워낙 많고, ACL 관리가 철저하다보니, 갑자기 관리중인 머신의 SSH 포트와 VNC 포트가 내려가는 참사가 벌어졌다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;재택중이라 출근하신 분에게 sshd만 수동으로 올려달라고 부탁했고, 터미널에서 확인해보니 launchctl을 이용해서 sshd가 안올라가는 것으로 확인함..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그래서 기존 sshd.plist를 copy해서 내가 필요한 부분만 짤라서 구성해보기로 했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;내 요구사항은 아래와 같았다.&lt;/p&gt;
&lt;p&gt;1. ssh 접근이 되어야 함.&lt;/p&gt;
&lt;p&gt;2. 장비의 전원을 뽑았다 켜도 ssh 접근이 되어야 함.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결론은 아래와 같이 plist를 구성했고, 정상동작하는 것을 확인했다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1619688495978&quot; class=&quot;javascript&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
&amp;lt;dict&amp;gt;
  &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
  &amp;lt;string&amp;gt;com.sshd.alternative&amp;lt;/string&amp;gt;
    &amp;lt;key&amp;gt;RunAtLoad&amp;lt;/key&amp;gt;
    &amp;lt;true/&amp;gt;
  &amp;lt;key&amp;gt;Program&amp;lt;/key&amp;gt;
  &amp;lt;string&amp;gt;/usr/sbin/sshd&amp;lt;/string&amp;gt;
  &amp;lt;key&amp;gt;StandardErrorPath&amp;lt;/key&amp;gt;
  &amp;lt;string&amp;gt;/tmp/sshd.alternative&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;
...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이후 Label에 지정한 string을 이용해서 아래와 같이 컨트롤하면 된다.&lt;/p&gt;
&lt;p&gt;$ launchctl start | stop com.sshd.alternative&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;희한한건 보안업데이트 든 뭐든 업데이트하면 원상 복귀됨.. 이유를 알 수 없다. 장비 문제인가?&lt;/p&gt;</description>
      <category>개발/Linux, System</category>
      <category>launchctl</category>
      <category>sshd</category>
      <author>Reimu.</author>
      <guid isPermaLink="true">https://hakurei.tistory.com/312</guid>
      <comments>https://hakurei.tistory.com/312#entry312comment</comments>
      <pubDate>Thu, 29 Apr 2021 18:34:29 +0900</pubDate>
    </item>
    <item>
      <title>[fastlane] 실행 계정이 달라진 후 unlock-keychain을 못하는 이슈 해결</title>
      <link>https://hakurei.tistory.com/311</link>
      <description>&lt;p&gt;사용자 계정으로 잘 돌던 스크립트가, 재부팅 시 서비스를 동작하게 하기 위해 root로 계정을 옮겼더니,&lt;/p&gt;
&lt;p&gt;fastlane unlock-keychain 동작 시 키체인을 못찾겠다고 에러를 뱉었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;인증서 자체를 기존 사용자 계정의 키체인에 등록했기 때문에, 당연한 결과라고 생각했고,&lt;/p&gt;
&lt;p&gt;root에 인증서를 등록하는 것은 미련한 행동이라 생각하여, unlock-keychain에 argument가 없을지 검색해보았다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;역시나 있었다!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.fastlane.tools/actions/unlock_keychain/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docs.fastlane.tools/actions/unlock_keychain/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1615183674467&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;unlock_keychain - fastlane docs&quot; data-og-description=&quot;&amp;lt;!-- This file is auto-generated and will be re-generated every time the docs are updated. To modify it, go to its source at https://github.com/fastlane/fastlane/blob/master/fastlane/lib/fastlane/actions/unlock_keychain.rb --&amp;gt; unlock_keychain Unlock a keyc&quot; data-og-host=&quot;docs.fastlane.tools&quot; data-og-source-url=&quot;https://docs.fastlane.tools/actions/unlock_keychain/&quot; data-og-url=&quot;https://docs.fastlane.tools/actions/unlock_keychain/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UHJB6/hyJtIaJMgx/HZyodYKZ985IRz8NHHvytK/img.png?width=871&amp;amp;height=304&amp;amp;face=0_0_871_304&quot;&gt;&lt;a href=&quot;https://docs.fastlane.tools/actions/unlock_keychain/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.fastlane.tools/actions/unlock_keychain/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UHJB6/hyJtIaJMgx/HZyodYKZ985IRz8NHHvytK/img.png?width=871&amp;amp;height=304&amp;amp;face=0_0_871_304');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;unlock_keychain - fastlane docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&lt;!-- This file is auto-generated and will be re-generated every time the docs are updated. To modify it, go to its source at https://github.com/fastlane/fastlane/blob/master/fastlane/lib/fastlane/actions/unlock_keychain.rb --&gt; unlock_keychain Unlock a keyc&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;docs.fastlane.tools&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;path에다가 원래 등록했던 keychain의 경로를 명시해주면 된다.&lt;/p&gt;
&lt;p&gt;대략 아래와 같은 경로다.&lt;/p&gt;
&lt;pre id=&quot;code_1615183741389&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Fastfile
...
unlock_keychain(
  path: '/Users/xxx/Library/Keychains/login.keychain-db',
  password: 'abcde12'
)
...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;바꿔주니 잘 되는군!&lt;/p&gt;</description>
      <category>개발/Linux, System</category>
      <category>Fastlane</category>
      <category>unlock_keychain</category>
      <author>Reimu.</author>
      <guid isPermaLink="true">https://hakurei.tistory.com/311</guid>
      <comments>https://hakurei.tistory.com/311#entry311comment</comments>
      <pubDate>Mon, 8 Mar 2021 15:09:25 +0900</pubDate>
    </item>
    <item>
      <title>[OSX] LaunchAgents와 LaunchDaemons</title>
      <link>https://hakurei.tistory.com/310</link>
      <description>&lt;p&gt;homebrew를 통해서 jenkins를 설치했고, 빌드 머신이 될 놈이기 때문에, 리부팅이 되어도 문제 없도록 만들어야하는 니즈가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;homebrew를 이용하면 아래와 같은 명령어로 손쉽게 시작 / 중지 / 재시작이 가능하고,&lt;/p&gt;
&lt;p&gt;내부적으로 launchd를 활용해서 부팅 후 로그인 시 서비스 재시작도 어느정도 관리를 해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1615181709853&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 서비스 시작
$ brew services start jenkins-lts

# 서비스 중지
$ brew services stop jenkins-lts

# 서비스 재시작
$ brew services restart jenkins-lts&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;근데 내가 필요한건, 머신이 재부팅 된 후에, 유저 로그인을 하지 않아도 리눅스처럼 서비스가 동작하는 것이 목표였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여러 자료를 찾아보니, MAC에는 LaunchAgents와 LaunchDaemons라는 놈들이 있는데..&lt;/p&gt;
&lt;p&gt;Homebrew에서 제공하는 brew services 키워드의 경우 일반 유저로 서비스 실행 시 LaunchAgents라는 놈을 이용하고,&lt;/p&gt;
&lt;p&gt;root 권한을 획득한 후에 실행하면 LaunchDaemons라는 놈을 이용하는 것으로 보였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 두 개의 차이는 뭐일까?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;LaunchAgents라는 놈의 경우 서비스를 재시작 해주긴하지만, 유저가 로그인했을 경우(ssh를 통한 로그인은 해당이 안됨)에 약속된 서비스를 재시작 해준다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;LaunchDaemons라는 놈은 우리가 흔히 알고 있는 리눅스에서의 서비스 처럼, 머신이 재부팅되어도 재시작을 해준다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결론은 아래와 같은 명령어를 이용하면, 내가 원한 방향이 만들어지게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1615181881839&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 서비스 시작
$ sudo brew services start jenkins-lts

# 서비스 중지
$ sudo brew services stop jenkins-lts

# 서비스 재시작
$ sudo brew services restart jenkins-lts&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만... 귀찮은 일이 하나 남았다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;서비스 실행하는 계정 자체가 변경이 되었기 때문에, jenkins처럼 유저별로 데이터를 저장하는 특성이 있는 경우,&lt;/p&gt;
&lt;p&gt;이를 옮겨주어야 한다. (아.. 이런거 때문에 역시 docker를 써야해;;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;MAC 장비 스펙이 낮아서 standalone으로 설치를 해보았는데, 사실 docker를 쓰면 고민할 필요가 없는 문제이긴하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그 와중에 다행인건, 기존에 쓰던 유저 하위의 .jenkins 폴더 내용을 통째로, root로 복사했더니 잘 동작한다!&lt;/p&gt;</description>
      <category>개발/Linux, System</category>
      <category>homebrew</category>
      <category>jenkins</category>
      <category>LaunchAgents</category>
      <category>LaunchDaemons</category>
      <author>Reimu.</author>
      <guid isPermaLink="true">https://hakurei.tistory.com/310</guid>
      <comments>https://hakurei.tistory.com/310#entry310comment</comments>
      <pubDate>Mon, 8 Mar 2021 14:43:21 +0900</pubDate>
    </item>
    <item>
      <title>[OSX] OSX에서 Windows 공유폴더 마운트하기</title>
      <link>https://hakurei.tistory.com/309</link>
      <description>&lt;p&gt;본인은 일반적으로 업무환경이 Windows PC가 주가 되고, OSX가 설치된 장비는 빌드머신 혹은 R&amp;amp;D용도로 사용을 하는 편이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그렇기 때문에, 자주 파일 / 폴더 등을 옮겨야하는데, 사내 보안이 워낙 엄청나게 철저하기 때문에, 메일 등을 이용해서 하나하나 손수 옮기곤 하다보니, 자괴감이 들던 중 아래와 같은 생각을 하게 됨.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1안 : MAC에 smb 서버를 올려볼까?&lt;/p&gt;
&lt;p&gt;2안 : 윈도우에 공유폴더 생성하고, MAC에서 mount해서 쓰면 굳이 옮길 필요가 없지 않을까?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2안이 좀 더 간단해보여서 시도해보았고, mac에서 mount 관련 명령어를 다양하게 제공하고 있어서, 충분히 가능하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같은 절차로 진행하면 됨.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 윈도우 환경에서 OSX와 동기화할 폴더 하나를 공유폴더로 생성하고, 특정 유저가 접근할 수 있도록 만든다.&lt;/p&gt;
&lt;p&gt;(이건 검색하면 많이 나오므로 과정은 생략)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 맥에서 터미널을 이용하여 해당 폴더를 Mount한다.&lt;/p&gt;
&lt;pre id=&quot;code_1614736916307&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 패스워드에 특문이 포함된 경우 escape가 필요하다. (url encoding 형태면 적합)
$ mount_smbfs //{계정}:{패스워드}@WindowsPC명/경로 OSX경로&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 MAC이든 Windows든 해당 폴더에만 파일을 두면, 어디서든 접근할 수 있게 되었다. (편안)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;재부팅하면 왠지 풀릴거 같은데, 리눅스처럼 /etc/fstab 같은게 있지 싶은데,&amp;nbsp;MAC을 끌일이 거의 없으므로 이건 일단 패스&lt;/p&gt;</description>
      <category>개발/Linux, System</category>
      <category>mount_smbfs</category>
      <author>Reimu.</author>
      <guid isPermaLink="true">https://hakurei.tistory.com/309</guid>
      <comments>https://hakurei.tistory.com/309#entry309comment</comments>
      <pubDate>Wed, 3 Mar 2021 11:03:22 +0900</pubDate>
    </item>
  </channel>
</rss>