• 리눅스 서버 느림 부하 확인 조치방법

    리눅스 서버 느림 부하 확인 조치방법

    요즘 제가 운영하는 시스템이 손볼곳이 많아서 거의 두달 가까이 다른업무를 할수 없고 이 업무에 집중하고 있습니다. 그중에서 리눅스 서버 느림 현상을 만드는 부하의 원인에 대해서 조사하는중 특정 IP로 지속적인 서버 공격이 있었습니다.

    route 명령어를 이용하여 IP를 하나 막았는데…

    route add -host 180.230.13.57 reject

    다시 다른 아이피로 변경해서 아래처럼 또 공격을 하고 있습니다.

    이번에는 IP를 45.35182.179 로 변경했군요.

    이게 악의적으로 공격한다는것을 어떻게 알수 있냐하면… 기존에 차단한 IP를 차단 풀었더니 그 아이피로는 공격이 안들어오고 있기때문입니다. 즉 누군가가 일부로 리눅스맨 워드프레스 블로그로 공격을 하고 있다는 거죠.

    이런경우라면 수동으로 IP를 차단해봐야 또 그사람도 아이피를 VPN등 이용해서 바꾸고 다시 또 공격할겁니다.

    악의적으로 공격하는것이니 IP추적하여 VPN 업체 알아내고 그 VPN업체를 사이버수사대에 신고하면되지만…

    그런것조차 일이되고 제가 해야할 업무는 태산이라보니 그냥 무시하기로 했습니다.

    그냥 단순히 프로그램 하나 파이썬으로 개발해서 자동으로 IP를 차단하도록 했습니다.

    45.35.182.179 - - [30/Jan/2023:18:27:19 +0900] "\xbfI\xae\xa4E7\x97\x8a\xb9\x0e\xa7\xe2\xca\x8c\x01UH\xf5\x07\xb8\xd0\xa6\xe1\x94\x89\xe0z\xc1c\xe7\x99\xc8\xc7\x84$\x9f\x1d\\-y=\xa8\xd6P\xf9\b'\t\x95\x8b\\R\x0c\x1a\x14a\x88\xfc\xaf\x1c\xeb{\xa0a1\x9a\xae~(\xa8\xc8f@\xe5K9\xe0\x93\x1d%\xe7\x14\xb2\xb0\x94\x1b\b\xad\xc1\xd7tZ{\xd4\xaf,\xcf\xfa\x7f\xb9\xe9\xb2j\x8e\xb94\xbe^\x9fK\x89=\x1e\x16\xf1C\x13/\x87\xf6\x1b[\x8b\xa6\x0f\xe1\x82\x16\xca+\x17?\xfe|\x9aTp\xcc\x9f^\xfd\x18\x1a\xadA\xda{\x801b\x1cm-\x93\xa9\xf5\xe0\rz\xed?PN\x7f7\x90\xda\xc2\x18[9\xe5\x8c\xdc\xd5}e\xf1\x03\xfaKp'\r\xa5\x86\xc4\x9a\xd6\xaa\vjP\xa2\xc3#>\xbe\xdd\xac\x8e\xa0\x03\xd3\x98\xc3" 400 226 "-" "-"
    

    내용을 보면 문자를 인코딩해서 딱히 정확히 뭘 하려는건지는 알듯합니다.

    일단 IP를 바꿔서 재차 공격을 했다는것만 보면 악의적으로 서버부하를 일으켜서 트래픽을 발생시키기 위함입니다.

    일단 금전적인 돈으로 지출을 유도한것으로 보이고요. 서버 해킹이나 뭐 이런건 관심이 없는듯합니다.

    인코딩하면 제가 그 인코딩이 뭘까? 라고 파악할꺼라 생각하겠지만 문자열을 분석해보면 일치되는건 전혀 없고 단순 무의미한 글자를 인코딩해서 저렇게 날리는거보면 서버 부하를 일으켜서 서버 느리게 하고 트래픽으로 서버지출비용을 늘리기 위한 노력인것으로 보입니다.

    게다가 악의적으로 아이피를 바꿔가면서 공격한다는것은 그냥 제가 운영하는 이 워드프레스가 맘에 안드는것으로 보입니다.

    그거 말고는 답이 없습니다.

    일단 파이썬으로 자동으로 아이피 차단하도록 설정해두었으니 모든 서버에 적용시켜서 앞으로는 신경을 안써도 됩니다. 혹시라도 저처럼 이런 악의적인 서버 부하로 서버가 느림현상에 시달리고 계신다면 저에게 요청해주세요.

    제가 만든 자동화 파이썬 툴을 이용해서 자동으로 라우트 IP 차단을 하시기 바랍니다.

    더군다나 서로 공격 IP를 공유해서 미리 공격 IP를 차단시킬 수 있으니 함께 사용하면 더 좋을듯합니다.

    사용하실분들은은 운영하시는 웹서버 블로그에 이 글을 공유하셔서 더 많은 분들이 참여할 수 있도록 해주세요.

    감사합니다.

  • 설정 파일의 암호 (blowfish_secret)의 길이가 올바르지 않습니다. 32 바이트 이상이여야 합니다

    설정 파일의 암호 (blowfish_secret)의 길이가 올바르지 않습니다. 32 바이트 이상이여야 합니다

    설정 파일의 암호 (blowfish_secret)의 길이가 올바르지 않습니다. 32 바이트 이상이여야 합니다

    The secret passphrase in configuration (blowfish_secret) is too short

    Put! the blowfish_scret code

    vi /usr/share/phpmyadmin/config.inc.php

     

    blowfish secret generator

    /**
    * This is needed for cookie based authentication to encrypt password in
    * cookie. Needs to be 32 chars long.
    */
    
    $cfg['blowfish_secret'] = 'IXIMDe;@zCBz.8@&+2jsN2;@;ilgsrdE';
    
    /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
    
    

  • 닷넷프레임워크 전체 버전 SDK 비쥬얼 스튜디오 개발 다운로드

    닷넷프레임워크 전체 버전 SDK 비쥬얼 스튜디오 개발 다운로드

     Download .NET SDKs for Visual Studio

    최근에 비쥬얼스튜디오에는 닷넷프레임워크 4.8 이상이 기본탑재되어 나옵니다.

    그 이전 단계의 닷넷프레임워크를 사용하거나 프로그램된 소스를 변경하려면 각 버전에 맞게 SDK를 설치해야지만 가능해집니다.

    저는 이번에 4.5.1 버전으로 제작된 C# 프로그램을 수정해야했습니다.

     

    Supported versions 과 Out of sepport versions 이렇게 두 항목으로 나뉘어집니다.

    보통 윈도우 7 까지 개발을 했다면 닷넷프레임워크 4.5까지라고 보면되고요.

    그 이후부터는 보안레벨이 변경되면서 윈도우7에서도 특정 보안 업데이트를 받지 않는이상 4.6 버전 부터 사용할 수 없습니다.

    4.5.1 버전이 보안업데이트 직전 버전이라고 보면되고 윈도우7이 현재 자동업데이트가 안되므로 대부분 4.5 이하의버전에서 프로그램잉을 해야합니다.

    보안업데이트가 된 윈도우 7에서는 4.8까지도 설치가 가능합니다.

     

    언제까지 버전을 다운로드 할 수 있도록 제공해줄지는 모르겠지만 최대한 온라으로 설치를 해보죠.

    만약 아래 링크로 다운되지 않거나 사라졌거나 한다면 저에게 따로 링크를 요청해보시기 바랍니다.

    최대한 개발을 하기 위해서 설치 SDK를 보관하고 있지만 저도 언제까지 보관할 수 있을 지 모르겠습니다.

    4.51, 4.52, 4.6, 4.61. 4.62, 4.7 4.71, 4.72, 4.8

    (현재 이 버전은 제가 SDK로 개발팩을 오프라인 확보 해 놓은 상태입니다.)

    Download matrix for .NET Framework
    Version Developer Pack Tooltip: Do you want to build apps? The developer pack is used by software developers to create applications that run on .NET Framework, typically using Visual Studio. Runtime Tooltip: Do you want to run apps? The runtime includes everything you need to run existing apps/programs built with .NET Framework. Release notes
    .NET Framework 4.8.1 Developer Pack Runtime Release notes
    .NET Framework 4.8 Developer Pack Runtime Release notes
    .NET Framework 4.7.2 Developer Pack Runtime Release notes
    .NET Framework 4.7.1 Developer Pack Runtime Release notes
    .NET Framework 4.7 Developer Pack Runtime Release notes
    .NET Framework 4.6.2 Developer Pack Runtime Release notes
    .NET Framework 3.5 SP1 Runtime Release notes

     

    Version Developer Pack Tooltip: Do you want to build apps? The developer pack is used by software developers to create applications that run on .NET Framework, typically using Visual Studio. Runtime Tooltip: Do you want to run apps? The runtime includes everything you need to run existing apps/programs built with .NET Framework. Release notes
    .NET Framework 4.6.1 Developer Pack Runtime Release notes
    .NET Framework 4.6 Developer Pack Runtime Release notes
    .NET Framework 4.5.2 Developer Pack Runtime Release notes
    .NET Framework 4.5.1 Developer Pack Runtime Release notes
    .NET Framework 4.5 Runtime Release notes
    .NET Framework 4.0 Runtime Release notes

     

    닷넷프레임워크 4.5.1 SDK 개발팩을 다운받아 설치했습니다.

    최근에 대부분 TVM 이미지를 윈도우 10으로 변경하기는 했지만…

    그래도 버전이 낮으면 조금 더 가볍겠죠 ㅎㅎ

  • FastSpring 결제 모듈 수수료 정리 in wordpress

    FastSpring 결제 모듈 수수료 정리 in wordpress

    워드프레스에 해외 결제모듈 연결하는것도 생각보다 손이 많이 갑니다.

    (어쩌면 제가 몰라서 손이 많이 가고 쉬운길을 빙빙 돌아가고 있을 수 있습니다. 쉬운방법 있으면 알려주세요 ㅎㅎ)

    국내에서 이용가능한 PG사의 경우에는 카드회사별로 심사와 초기비용 20만원 이렇게 내면 진행은 되는데 결정적으로 디지털상품에 대한 수수료가 너무 많이 내야합니다.

    그부분때문에 10년전부터 지금까지 제가 PG사를 가입하지 않는 이유이기도 합니다.

    FastSpring 결제 할때 디지털상품에 대한 수수료

    W-8BEN 세금 정보 입력할때

    혹시라도 사업자 번호가 없는데 세금관련 정보를 입력해야한다면 신분증( 주민등록번호,  여권번호 ) 를 상황에 맞게 입력하면 됩니다.

    일단 결론부터 이야기를 하면…
    디지털상품 결제에 대한 수수료는 한국과 비교하면 양호한 편이나 결제당 수수료가 무조건 0.95달러라보니 (대략 1,300원) 생각보다 금액이 큽니다.
    예를들어서 한국에서 천원짜리 디지털 상품을 판매할경우 배보다 배꼽이 더 커버리는 상황이 발생하게됩니다.
    과거에 이런경우가 있었는데…
    카드결제 초창기때 최소결제 단위가 존재하던 시절에 결제시 최소 300원 혹은 500원이라서 문구나 소금액 상품을 결제할수가 없었죠.
    지금은 라이터 하나 사더라도 카드결제하는 시대라서 이부분이 조금 아쉽기는 했지만 자사몰에서 전세계를 상대로 결제시스템을 만들수 있다는 메리트 하나만 본다면
    패스트스프링 결제모듈도 사용해볼만 하다고 생각합니다.
    일단 신청을 해보고 맘에 안들면 빼고 스마트스토어나 블로그결제 같은 소형업체에서 사용할 수 있는 PG사 연계상품을 사용하던지 해야겟습니다.

    FastSpring Order Form and Terms of Service

    Description Frequency Amount
    Digital Retailer Rate Per transaction 5.9%
    Transaction Fee Per transaction $0.95 USD

     

     

    참고로 네이버 스마트스토어를 결제용도로 사용하게되면 결제단계가 1단계 더 생기게되어 결제률이 다소 떨어질수는 잇습니다.

    다만 수수료라던지 이런 부분들은 상당히 유리해집니다. 거의 3%~5% 수준이며 상대방이 무통장 입금을 할 경우에는 수수료가 거의 들지 않습니다. 100~300원 수준입니다.

    대신 단점이라면 결제 완료에 대한 통보를 따로API 형식으로 제공 받을 수 없기때문에 판매자가 매번 확인해서 상품을 보내줘야 하는 단점이 있습니다.

    이를 보안하기 위해서 네이버 스마트스토어 자동화 시스템을 도입한다면 나름 괜찮은 방법이긴 합니다. 일반인들은 시스템을 만들기가 쉽지 않지만 만들면 좋습니다.

    스마트스토어 자동 프로그램 만들기

     

    저라도 도전해보겠습니다.

    이미 만들어진 시스템이 있는데 여러분들도 사용할 수 있도록 모듈화 해보겠습니다.

    필요하신 분들은 연락한번 해보세요. 언젠가는 함께 윈윈하는 방법이 나와서 하고 있겠죠^^

  • how to edit esxi 7 crontab 크론탭 IP 자동 하는 방법

    how to edit esxi 7 crontab 크론탭 IP 자동 하는 방법

    크론탭을 이용하여 esxi 7 서버의 IP를 주기적으로 확인 하는 방법입니다.

    홈 PC등 개인적으로 집에서 서버를 운영할 경우 갑작스럽게 서버가 셧다운되거나 IPS사의 게이트웨이 주소 변경으로 IP가 변동되는 경우가 있습니다. 이런 경우에는 직접 서버 아이피를 확인해야하지만 원격지에서 변경된 아이피를 확인 할 수 없습니다.

    재부팅하더라도 아래처럼 입력해놓을경우 초기화되지 않습니다.

    /etc/rc.local.d/local.sh

    /vmfs/volumes/datastore1/root/serverChecker.sh

    exit 0 위에 한줄 추가

    만약 cronjob 에 초기화 안되게 하려면

    local.sh 항목에 매번 부팅할때마다 cronjob 자동으로 등록되도록 명령어를 입력해야합니다.

    #put to crontab
    
    echo "*/1 * * * * /vmfs/volumes/datastore1/root/serverChecker.sh" >> /var/spool/cron/crontabs/root
    
    #cronjob force stop
    
    kill `cat /var/run/crond.pid`
    
    #cronjob start
    
    /usr/lib/vmware/busybox/bin/busybox crond


    vi /etc/rc.local.d/local.sh
    
    echo "*/1 * * * * /vmfs/volumes/datastore1/root/serverChecker.sh" >> /var/spool/cron/crontabs/root
    kill `cat /var/run/crond.pid`
    /usr/lib/vmware/busybox/bin/busybox crond

    그때 ESXi 7에 등록된 cronjob 기능을 이용하여 외부에서 변경되는 실시간 IP를 확인 할 수 있습니다.

    크론탭 자동 등록하는 방법

    how to VMWARE ESXi 7 crontab

    1. VMWARE ESXi 7 SSH 접속을 하고 아래 폴더로 이동합니다.

    cd /var/spool/cron/crontabs

    yum 으로 따로 설치를 하지 않아도 이미 크론탭과 기능이 동일한 스케줄러가 동작하고 있습니다.

    2. root 파일에 쓰기권한을 추가합니다.

    읽기전용 root 파일을 쓰기 권한으로 변경합니다.

    chmod 777 root

    3. 1분마다 서버 IP를 확인 하도록 스케쥴을 등록합니다.

    vi 명령어를 이용하여 root파일에 기존 리눅스 crontab -e 명령어로 사용했던 그대로 일정을 기록합니다.

    재부팅, 서버부팅마다 /root 폴더가 사라지므로 폴더는 꼭 /vmfs/volumes/datastore1/root 에 만드시기 바랍니다

    */1 * * * * /root/serverChecker.sh
    
    #min hour day mon dow commmand
    
      *       *        *       *       *      /shellscript.sh

    4. root파일을 다시 읽기 권한 다시 변경합니다.

    쓰기 권한을 다시 읽기전용 root 파일로 변경합니다.

    chmod 444 root

    4. 1분마다 서버 IP를 확인 하도록 등록합니다.

    serverCheck.sh 파일은 /root 폴더 아래에 두었으며 내용은 wget을 이용하여

    특정 웹서버에 1분마다 페이지를 읽어 그 서버에서 ESXi 7 서버의 ip를 알 수 있도록 하였습니다.

    재미있는 방법으로는 ESXi 7 서버내에 CentOS 리눅스 하나 설치해서 워드프레스 서버를 하나 운영하고 그 워드프레스 주소로 ip를 확인 할 수 있습니다.

    wget http://yourWebServerDomain/serverChecker.php?SERVER_NAME

    1분마다 ESXi 서버의 IP가 확인 됩니다.

    serverCheck.php 파일에 mysql 을 연결하여 매 분마다 들어오는 IP를 저장하고

    최근 등록된 IP 순서대로 ( order by regDate DESC ) 추출하면 자신의 ESXi 서버 리스트를 만들 수 있습니다.

    serverChecker.sh 파일

    SERVER_DOMAIN="domain=domainName"
    SERVER_INFO="&cpu=x4cpu22core44thread&cpuinfo=Intel_E7-8880v4_2.20GHz&ram=1024gb_64gx16&ssd=8TB_2TBx4"        
    cd /vmfs/volumes/datastore1/root/
     
    wget http://33.34.246.187/serverChecker.php?$SERVER_DOMAIN$SERVER_INFO
    rm -rf /vmfs/volumes/datastore1/root/serverChecker.php*
    
    # 1 - 30 = 4 - 10

    최근에는 위의 설정도 많이 복잡해서 그냥 호스트네임 그대로 땡겨와서 IP만 체크합니다.

    SERVER_HOSTNAME=`hostname`
    wget http://33.34.246.187/serverChecker.php?ESXi=${SERVER_HOSTNAME} >> /etc/serverChecker.logs
    echo "*/1 * * * * wget http://33.34.246.187/serverChecker.php?ESXi=${SERVER_HOSTNAME} >> /etc/serverChecker.logs" >> /var/spool/cron/crontabs/root
    kill `cat /var/run/crond.pid`
    /usr/lib/vmware/busybox/bin/busybox crond
    rm -rf serverChecker.php*
    
    # 1 - 30 = 4 - 10
    # 1 - 30 = 4 - 10
    # 두번 변경해야함!!
    
  • C# 현재 실행파일 이름 가져오기

    C# 현재 실행파일 이름 가져오기

    C# 프로그램을 개발할때 실행중인 파일 이름을 가져와서 이름으로 넣어야 할 경우가 있습니다.

    가령 프로그램을 각자의 이름대로 사용하고 싶을때 그렇죠.

    그럴경우 System.IO.Path 매소드를 이용하면 쉽게 현재 실행중인 파일 이름 또는 파일이름과 확장자를 포함한 이름을 가져올 수 있습니다.

     

    제가 하고 싶은것은 각 교회마다 원하는 이름으로 기도회종료 프로그램을 사용할 수 있도록 하고 싶었습니다.

     

    프로그램명 = string.Format("{0}", System.IO.Path.GetFileName(Application.ExecutablePath));
    this.Text = string.Format("{0}", System.IO.Path.GetFileNameWithoutExtension(Application.ExecutablePath));

     

    System.IO.Path.GetFileName

    이 매소드는 확장자를 포함하여 이름을 가져옵니다.

    예를 들면 [ 광명교회기도회종료.exe ] 라고 파일명을 만들 경우 프로그램 이름이 확장자를 포함하여 [ 광명교회기도회종료.exe ] 라고 제목이 만들어집니다.

     

    System.IO.Path.GetFileNameWithoutExtension

    이 매소드는 확장자를 제외한 이름을 가져오기때문에 아래처럼 확장자 없이 이름을 갖게 됩니다.

     

  • c# 타이머 시계 거꾸로 77분을 01:14:59 내려가는 소스

    c# 타이머 시계 거꾸로 77분을 01:14:59 내려가는 소스

    거꾸로 타이머 소스입니다.

    00:00:00 포맷형식을 맞췄으며 카운터다운 시계처럼 만들 수 있습니다.

    거꾸로타이머.zip

     

    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }
    
    DateTime now;
    private void Form1_Load(object sender, EventArgs e)
    {
    
    
    }
    
    private void timer1_Tick(object sender, EventArgs e)
    {
    TimeSpan t = now - DateTime.Now;
    //textBox_timer.Text = String.Format("{0:00}:{1:00}:{2:00}", Math.Abs(t.Hours), Math.Abs(t.Minutes), Math.Abs(t.Seconds));
    //textBox_timer.Text = String.Format("{0:00}:{1:00}:{2:00}", (t.Hours), (t.Minutes), (t.Seconds));
    textBox_timer.Text = String.Format("{0}", t.ToString("hh':'mm':'ss"));
    }
    
    private void button_타이머_Click(object sender, EventArgs e)
    {
    timer1.Stop();
    
    now = DateTime.Now.AddMinutes(Int32.Parse(textBox_타이머.Text));
    
    timer1.Interval = 1000;
    timer1.Start();
    }
    }

     

    포맷 형식은 Timespan 형식에 맞춰서 만들어도 되지만 따로 시,분,초 따로 빼서 만드실 분들은 각각 속성 사용하시면됩니다.

     

     

  • c# string format 2자리 소수점 공백 특정문자 채우기

    c# string format 2자리 소수점 공백 특정문자 채우기

    시간을 설정할때 특히 1시부터 9시까지, 1분부터 9분까지, 1초부터 9초까지 아랫처럼 포맷되는 경우를 볼 수 있습니다.

    1:7:2

    이 부분을 아래 포맷형식으로 바꾸고 싶을때 사용합니다.

    String.Format("{0:00}:{1:00}:{2:00}", DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second)
    
    01:07:02

     

    숫자의 경우에는 위의 포맷형식으로 2자리 공백을 숫자 ‘0’으로 채울때 주로 사용합니다.

     

    그 이외 숫자가 아닌 특정 문자를 이용하여 자릿수를 채울때에는 PadLeft(), PadRight() 메소드를 사용합니다.

    이 매소드는 String 문자열에 대한 매소드이므로 숫자로된 표기가 있다면 꼭 ToString() 문자열로 바꾼 후에 사용해야합니다.

    int indexNumber;
    
    int 점점점갯수;
    string 자동모드_점점점 = "ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ";
    
    
    
    // 위의 변수를 모두 전역변수로 설정하고 아래 문자열을 timer에 넣어서 indexNumber++ 돌리면 위의 움짤처럼 동작하게됩니다.
    
     int 점점점갯수 = Math.Abs(점점점.Length - (indexNumber++ % ((자동모드_점점점.Length) * 2)));
    
    string.Format("자동모드 진행 중 [ {0,9} ] {1,22}", indexNumber.ToString().PadLeft(9, '0'), 점점점.Substring(점점점갯수));

     

     

    참고로 c#에서 소숫점 자리 2자리 3자리 … 10자리 만들때에는 아래처럼 해야합니다.

    방법이 조금 다릅니다.

    string.Format("{0:N2}", 0.12758663) // 0.12
    
    string.Format("{0:N3}", 0.12758663) // 0.127
    
    string.Format("{0:N4}", 0.12758663) // 0.1275

     

    이때 소숫점이 1000보다 클 경우 자동으로 콤마가 붙습니다.

    이를 막을려면 Math 함수를 이용하여 Round() 같은 매소드로 특정 자릿수 이하를 제거하고 단순하게 string.Format(“{0}”, Math.Rount(0.12758663, 3) // 0.127

    string.Format("{0}", Math.Round(1270.12758663, 3)) // 1270.128 자동으로 마지막 소수점 세자리부분에서 반올림하고 콤마 없이 표기

     

    Math.Ceiling(1270.12758663) // 올림 1270

    Math.Truncate(1270.12758663) // 버림 1270

    하지만 특정 소수점 자리이하를 올리거나 버리지는 못하죠.

    이때 방법은 5번째자리를 올리거나 버리고 싶다면 소수에 10에 5승 [ Math.Pow(10, 5) ] 값을 곱하고 Round() 처리하고 다시 10의 5승 값을 나누면됩니다.

    조금 복잡해보이기는 하지만 응용하여 사용하면됩니다.

     

  • [ Solved ] real time console output redirection c# cmd comman source code

    [ Solved ] real time console output redirection c# cmd comman source code

    It is a code that shows CMD instructions in real time using cshop.
    Take one line each using StandardOutput and transfer it to TextBox in real time.

     

    There is a full source code below.
    Download it and use it.

    In addition, the important part at the bottom is marked in red.

     

    REALTIME CMD.zip

    if (textBox_cmd.Text == "cls")
    {
    this.Invoke((MethodInvoker)delegate
    {
    textBox_result.Text = String.Empty;
    });
    return;
    }
    
    var proc = new Process()
    {
    StartInfo = new ProcessStartInfo("cmd.exe", "/c " + textBox_cmd.Text)
    {
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    CreateNoWindow = true,
    UseShellExecute = false
    },
    EnableRaisingEvents = true
    };
    
    proc.Start();
    
    using (StreamReader reader = proc.StandardOutput)
    {
    string line;
    
    while ((line = reader.ReadLine()) != null)
    {
    Console.WriteLine(line);
    
    this.Invoke((MethodInvoker)delegate
    {
    textBox_result.AppendText(line + Environment.NewLine);
    });
    }
    
    }
    proc.WaitForExit();

     

     

     

     

    c# source code (Full code)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace REALTIME_CMD
    {
    public partial class Form_REALTIME_CMD : Form
    {
    public Form_REALTIME_CMD()
    {
    InitializeComponent();
    }
    
    private void button_RUN_Click(object sender, EventArgs e)
    {
    실행();
    }
    private void 실행()
    {
    if (backgroundWorker_cmd.IsBusy != true)
    {
    backgroundWorker_cmd.RunWorkerAsync();
    }
    }
    
    private void textBox_cmd_KeyDown(object sender, KeyEventArgs e)
    {
    if(e.KeyCode == Keys.Enter)
    {
    실행();
    }
    }
    
    private void backgroundWorker_cmd_DoWork(object sender, DoWorkEventArgs e)
    {
    
    if (textBox_cmd.Text == "cls")
    {
    this.Invoke((MethodInvoker)delegate
    {
    textBox_result.Text = String.Empty;
    });
    return;
    }
    
    var proc = new Process()
    {
    StartInfo = new ProcessStartInfo("cmd.exe", "/c " + textBox_cmd.Text)
    {
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    CreateNoWindow = true,
    UseShellExecute = false
    },
    EnableRaisingEvents = true
    };
    
    proc.Start();
    
    using (StreamReader reader = proc.StandardOutput)
    {
    string line;
    
    while ((line = reader.ReadLine()) != null)
    {
    Console.WriteLine(line);
    
    this.Invoke((MethodInvoker)delegate
    {
    textBox_result.AppendText(line + Environment.NewLine);
    });
    }
    
    }
    proc.WaitForExit();
    
    }
    }
    }
    
    
    
    

    c# cmd output in real time
    c# cmd 실시간
    c# cmd 출력
    c# cmd
    c# cmd command
    c# cmd 결과 출력
    c# cmd 명령어
    c# cmd 창 숨기기
    c# cmd command result
    c# cmd.commandtext
    c# cmd command example
    c# cmd command output
    c# cmd command not working
    c# cmd.commandtype
    c# cmd 명령어 실행 결과
    c# cmd 명령어 입력
    c# cmd.commandtext = update
    c# run cmd command output
    c# run cmd command get output
    c# run cmd command not working
    c# run cmd command and get output
    c# run cmd
    c# run cmd command
    c# run cmd with arguments
    c# run cmd command from code as administrator
    c# run cmd.exe with arguments
    c# run cmd command in background
    c# run cmd command from code and get output
    c# run cmd command on remote computer
    c# run cmd command with arguments
    c# run cmd file with arguments
    real time console output redirection c#
    real time output redirection c#
    real time redirection c#
    real time c#
    real time c# projects
    real time c# example
    update textbox real time c#
    get real time c#
    events in c# real time example
    delegates and events in c# real time example

     

  • [ Solved ] crontab won’t run python script how to use OS.SYSTEM method

    [ Solved ] crontab won’t run python script how to use OS.SYSTEM method

    Crontab won’t run python script!!

    Even if you run the python script directly in crontab, the related problems are the same.
    Python’s os.system() method does not work.

    If you use the automatic scheduler Crontab using Python, you should use it as below.

     

    How to use OS.SYSTEM() method

     

    1. Create a shell script file.

    make shell-script file (execute File)

    vi p.sh
    
    sudo /usr/bin/python3 /root/_PYTHON3/memcheck_httpd_restart.py
    df -h

    2. 755 Provide administrator authority.

    chmod 755 p.sh
    
    751 or 755

    3. Enter as below using the Crontab-e command.

    */1 * * * * /UserFileForderName/p.sh

     

    It’s going to work well now.

    Thank you 🙂

     

     

    If you want to make an automatic script using Python, check the post below and follow it.

    Look at the first article and install it.
    I look at the second article and update it.

    파이썬 자동화 리눅스 httpd restart 자동실행 스크립트

    아파치 자동 재시작 스크립트 폴더 남은 시간 계산 확인 python3 script 확장모델

  • 아파치 자동 재시작 스크립트 폴더 남은 시간 계산 확인 python3 script 확장모델

    아파치 자동 재시작 스크립트 폴더 남은 시간 계산 확인 python3 script 확장모델

    아파치 자동 재시작 스크립트입니다.파이썬 자동 스크립트, 파이썬 리눅스 자동화, 파이썬 폴더 시간, 파이썬 디렉토리 시간, 파이썬 디렉토리, 파이썬 디렉토리 확인, 파이썬 디렉토리 존재 확인, 파이썬 시간 빼기, 파이썬 남은 시간, 파이썬 남은 시간 계산

    AWS 운영중에 서버 부하로 인해서 httpd, mariadb (mysql) 서버가 메모리 부족현상으로 멈출때가 있습니다.

    이를 대비하여 메모리 수치를 지정해놓고 자동으로 멈췄다가 실행하는 파이썬 자동화 스크립트 입니다.

    기본적으로 아래 주소의 글을 읽으신 후 파이썬과 기본 모델을 설치를 하셔야합니다.

    그리고 이 확장 모델을 그대로 복사 붙이시면 오류없이 동작하게됩니다.

     

    cd /root/_PYTHON3
    rm -rf ppp.tar
    wget https://vlog.tion.co.kr/python/ppp.tar
    ll
    tar xvf ppp.tar
    rm -rf ppp.tar
    rm -rf /root/_PYTHON3/get-pip.py
    ll
    /p.sh

     

    모든 파일은 이미 정해진 위치와 정해진 동작을 하기 때문에 하나하나 따로 소스분석하시고 사용하셔도 되지만

    기본모델 + 확장모델 함께 복사 붙여넣기 방식으로 사용하시면 가장 편하게 사용하실 수 있을겁니다.

     

    추가된 모델은 function (기능) 하나 추가되었습니다.

    기존 _______isRUN 폴더가 생성된 시각을 확인하여 3분이 지날 경우 자동으로 삭제하도록 하였습니다.

    
    def delete_old_forder(delete_forder, delete_minutes):
    
    os.system("echo \"INFO: \"" + delete_forder + '__' + str(delete_minutes))
    
    if os.path.exists(delete_forder):
    timestamp_now = datetime.now().timestamp()
    
    is_old_forder = os.stat(delete_forder).st_mtime < timestamp_now - (delete_minutes * 60)
    os.system("echo \"TIME_CREAT: \"" + str(os.stat(delete_forder).st_mtime))
    os.system("echo \"TIME_NOW: \"" + str(timestamp_now))
    os.system("echo \"TIME_AFTER: \"" + str(timestamp_now - (delete_minutes * 60)))
    os.system("echo \"TIME_REMAIN: \"" + str(os.stat(delete_forder).st_mtime - (timestamp_now - (delete_minutes * 60))))
    
    if is_old_forder:
    try:
    os.rmdir(delete_forder)
    os.system("echo \"DELETE FORDER \"" + delete_forder)
    except OSError:
    os.system("echo \"ERROR DELETE FORDER\"")

     

     

    위의 펑션을 이용하시면 파이썬 폴더 남은 시간 확인이 가능하며

    폴더를 원하는 시각에 삭제, 생성도 가능해집니다.

    리눅스 운영하시는분들은 파이썬 이용하셔서 자동화 재부팅 시스템 만들어놓으시면 웹서버 운영이 많이 편해지십니다.

  • 라이트세일 워드프레스 아마존 AWS 서버 10번 설치하고 알아낸 사실

    라이트세일 워드프레스 아마존 AWS 서버 10번 설치하고 알아낸 사실

    라이트세일 워드프레스 구입을 하게되었습니다.

    처음에 AWS EC2만 9개의 인스턴스를 이용중이었습니다.

    서버 비용은 대략 30만원정도 지출이 되고 있는 상태입니다.

    워드프레스 블로그만 운영한다면 굳이 높은 금액의 EC2 인스턴스를 이용할 필요가 없습니다.

    저는 워드프레스뿐만 아니라 프로그램앱 구동과 시스템구축의 데이터베이스를 위해 사용중입니다.

    최근에 $5 플랜의 라이트세일로 어느정도 성능과 방문자를 유지할수 있는지 알고 싶어 라이트세일을 구입해보았습니다.

    그냥 눈 딱 감고 처음에 실행해야하는 명령어입니다.

    복사 붙여넣기하셔서 접속하신 다음 붙여넣기 하면됩니다.

    라이트세일 워드프레스 초기 설정

    단, root 암호입력과 vi를 통하여 세팅해야할 부분은 아래에서 각각 찾아 해야합니다.

    sudo passwd
    #암호 새로 입력 후 
    sudo su -
    
    #root 바로 접속하기 위함
    vi /root/.ssh/authorized_keys
    
    #alias 연결하기 위함 (주석제거)
    vi /root/.bashrc
    
    #SSH Port 22 변경
    vi /etc/ssh/sshd_config
    
    #파일 SSH전송
    sudo apt-get install lrzsz 
    sudo apt-get install python3-distutils
    
    reboot
    
    #wp-cache 설치 후 다시 644 되돌려놓기
    chmod 664 /opt/bitnami/wordpress/wp-config.php
    chmod 644 /opt/bitnami/wordpress/wp-config.php
    #마우스 복사 할 경우 위의 선행작업 후 아래를 복사 붙여넣기 해야합니다.
    
    #phpmyadmin URL
    vi /opt/bitnami/apache/conf/bitnami/phpmyadmin.conf
    
    

    Alias /phpmyadmin “/opt/bitnami/phpmyadmin”
    <Directory “/opt/bitnami/phpmyadmin”>
    Options -Indexes +FollowSymLinks -MultiViews
    AllowOverride All
    Require local
    ErrorDocument 403 “For security reasons, this URL is only accessible using localhost (127.0.0.1) as the hostname.”
    # AuthType Basic
    # AuthName phpmyadmin
    # AuthUserFile “/opt/bitnami/apache/users”
    # Require valid-user

    <IfVersion < 2.3 >
    Order allow,deny
    Allow from all
    Satisfy all
    </IfVersion>
    <IfVersion >= 2.3>
    Require all granted
    </IfVersion>
    ErrorDocument 403 “For security reasons, this URL is only accesible using localhost (127.0.0.1) as the hostname”
    </Directory>


    alias ls='ls $LS_OPTIONS'
    alias ll='ls $LS_OPTIONS -l'
    alias l='ls $LS_OPTIONS -lA'
    
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    
    sudo apt-get install lrzsz
    
    sudo apt-get install python3-distutils
    
    
    

    라이트세일 워드프레스 세팅이 까다롭다

    EC2 인스턴스를 주로 사용하다보니 이미 짜여진 각본?으로 만들어진 라이트세일 워드프레스 VM은 상당히 다루기가 어렵더군요.

    Bitnami를 이용하여 아파치와 php, DB를 이미 구성해놓은 기성품이라보니 거기에 제가 맞춰야하는 상황이 벌어졌습니다.

    EC2 인스턴스에  아파치서버와 mariadb, php 8 버전까지 제가 원하는 버젼별로 설치를 해서 맘대로 구성했다면…

    라이트세일 워드프레스는 아마존에서 사바 전문가들이 워드프레스 최적화 서버를 만들어놓았다? 정도로 해석할수 있습니다.

    그렇기 때문에 구성이 저랑 달라서 힘들었을뿐이지 워드프레스 최적화가 잘 되어있는지 제가 세팅한 EC2의 워드프레스보다 여러모로 잘 되어져있어보이고

    또 속도도 $5플랜치고는 t2.samll 에서 운영하는 제 워드프레스보다 빠른것같아 하나 돌려보고 괜찮으면 계속 늘려가볼 계획입니다.

    이 글 작성이 2021년 10월 27일이니… 이후에 시간이 꽤 많이 지난상태에서도 제가 지속적으로 라이트세일을 사용하고 있는지 확인해본다면…

    그 가치가 EC2 보다 좋다 못하다를 알수 있을겁니다.

    라이트세일 워드프레스

    하지만 오늘은 라이트세일 워드프레스를 제 입맛?에 맞도록 구성해야합니다.

    몇번을 더 삭제하고 생성해야 하는지 모르겠습니다.

    제가 이미 작성한 글을 보면서 한번에 쉽고 빠르게 만드실 수 있을겁니다.

    저는 이 글을 작성하기전에 이미 2번의 라이트세일 워드프레스 VM이미지를 삭제한 상태입니다.

    이번이 3번째입니다. (글 수정) 4번째 생성해서 진행 중 입니다.

    방금 아래처럼 페이지가 작동하지 않습니다. 라고 나와서 또 삭제하고 새로 설치중입니다.

    라이트세일 워드프레스 설치 과정

    1. ll 명령어 연결 활성화

    ll
    
    -bash: ll: command not found

    LL, ll, 엘엘 명령어 많이 치시죠?

    처음에 들어가면 초기화상태라서 심볼릭이 연결되어져있지 않습니다.

    그래서 ls -a 이런 명령어를 사용해야하는데 리눅스를 처음 접하시는 분들은 심볼릭? 이게 뭐야? 그러실수 있습니다.

    alias ls='ls $LS_OPTIONS'
    alias ll='ls $LS_OPTIONS -l'
    alias l='ls $LS_OPTIONS -lA'

    .bashrc 파일을 vi 명령어로 접속하면 대부분 주석이 되어져있는데 주석을 풀어도 되며 echo 명령어로 위의 명령어를 입력하여도 됩니다.

    2. lrzsz install ssh 툴 업로드 다운로드

    rz명령어와 sz 명령어를 이용하여 ssh 툴로z-modem 업/다운로드 하는 모듈을 설치해야합니다.

    이거는 사실 안해도되지만 제가 EC2 인스턴스에서 매번 서버에 다운받고 업로드 할 일이 많아서 설치를 했습니다.

    ssl 인증서를 업로드 할 경우와 워드프레스 블로그에 직접적으로 파일을 업로드 받을때, 백업 등등 에 활용합니다.

    sudo apt-get install lrzsz

    3. 라이트세일 워드프레스 ssh root 바로 접속

    보안상 이부분에 대해서는 나뉠수 있습니다.

    root접속을 바로 할 경우에는 여러모로 작업들이 편해지지만 user라던지 bitnami 계정으로 접근하게된다면

    매번 명령어를 사용할때마다 root권한을 얻은 sudo 명령어를 포함해서 입력해야합니다.

    vi 명령어를 이용하여 .ssh  숨은폴더 안의 인증서를 수정해야합니다.

    vi /root/.ssl/authorized_keys

    처음부터  [ ssh-rsa AAA…… ] 시작하는 앞 부분 싹 지워야합니다.

    sleep 10″ 이라고 나온 저부분까지 싹 지워야하죠.

    지우고 ESC -> wq 누르고 저장해서 나간다음 ssh가 그대로 접속된 상태에서 새로운 세션을 열어서 root로 접속해야합니다.

    만약 내가 실수를 해서 잘못지우거나 하면 바로 수정해야하기때문이죠.

    저는 이 부분을 너무 많이 해봐서 그냥 삭제하고 바로 접속했습니다.

    root 접속이 잘 되는군요.

    ※ root 접속하기 위해서는 먼저 root passwd 암호부터 설정해놓고 접속하셔야합니다.

    라이트세일 워드프레스는 이미 워드프레스가 설치가 된 상태이므로 따로 아파치를 설치한다거나

    가상호스트를 만들어준다거나 하지 않아도 이미 고정 ip만 입력하면 워드프레스에 접속됩니다.

    초기에 정해진 사용자와 암호는 user 이고 암호는 cat /home/bitnami/bitnami_application_password 명령어로 찾을 수 있습니다.

    cat /home/bitnami/bitnami_application_password

    처음부터 바로 글을 작성해도 상관은 없지만…

    ssl 인증서라던지 서버가 부하에 걸릴경우 자동으로 아파치를 재실행 해준다던지 등등

    SEO관련 기본 세팅과 서버 자동화를 위해 이러한 과정들 하나하나 세팅해야합니다.

    하루 날잡고 밤을 새서라도 이 글을 통해서 라이트세일 워드프레스를 마스터하시기 바랍니다.

    한번 세팅만 잘 해놓으면 이후로 그냥 워드프레스에 글만 작성하면됩니다.

    4. SSL 인증서 설치

    https://lightsail.aws.amazon.com/ls/docs/ko_kr/articles/amazon-lightsail-enabling-https-on-wordpress

    아마존 라이트세일 문서를 통해서 진행합니다.

    매우중요!!

    ※ bncert 모듈을 이용하면 80일마다 자동으로 갱신되기때문에 따로 설정을 할 필요가없습니다.

    sudo /opt/bitnami/bncert-tool

    이미 설치된 경우라면 저처럼 업데이트 될 경우 업데이트부터 하라고 나옵니다.

    업데이트까지 마친 상태라면 아래처럼 도메인 리스트[] 라고 콘솔창을 보게됩니다.

    자신이 인증서를 발급 받고자 하는 도메인 주소를 입력합니다.

    그 이후로는 대부분 Y와 동의를 눌러주면 설치가 진행됩니다.

    Changes to perform
    
    The following changes will be performed to your Bitnami installation:
    
    1. Stop web server
    2. Configure web server to use a free Let's Encrypt certificate for the domains: 
    mYDomain.com www.mYDomain.com
    3. Configure a cron job to automatically renew the certificate each month
    4. Configure web server name to: www.mYDomain.com
    5. Enable HTTP to HTTPS redirection (example: redirect http://mYDomain.com to 
    https://mYDomain.com)
    6. Enable non-www to www redirection (example: redirect mYDomain.com to 
    www.mYDomain.com)
    7. Start web server once all changes have been performed

    위의 내용이 무슨 말이냐하면…

    쉽게 말씀드리면 아파치 서버를 잠시 멈추고 모든 세팅이 완료되면 아피치를 실행하라는 이야기입니다.

    저는 그냥 뭐 아파치가 실행중인 상태에서 진행을 했으며 세팅 끝에 아파치를 종료하고 새로 시작해주었습니다.

    정상적으로 HTTPs  설치가 되었고 접속이 되는것을 확인하였습니다.

    ※ SSL 플러그인은 사실 설치 안해도 큰 문제는 안되지만 설치를 해놓으면 Redirect 등 자동으로 세팅을 해주니 편합니다.

    무슨말이냐하면… 혹시 나중에 보면서 또 잊을수도 있으니..

    글을 작성하고 제목이 바뀌어서 URL 까지 바꾸게될때 이때 Redirect 플러그인이 자동으로 글 주소를 지정해줍니다.

    다음으로 워드프레스 관리자에 접속부터 합니다.

    그리고 기본으로 설치되어져 있는 플러그인을 모두 활성화합니다.

    (SSL 플러그인을 설치 하기 위한 기본 확인단게입니다)

    저는 일단 업데이트까지 모두 하였습니다.

    나중에 필요없는 플러그인을 삭제는 하겠지만… 일단은 모두 활성화 & 업데이트 했습니다.

    Really Simple SSL 플러그인 플러그인 검색에서 찾아 설치합니다.

    Install Now 클릭하고 Active 활성화까지 눌러주세요.

    플러그인 리스트중에서 Really Simple SSL 플러그인이 아래처럼 보이면 정상 작동하는중입니다.

    Settings 눌러서 SSL을 설치합니다.

    혹시라도 아래처럼 나온다면 wp-config 파일을 664 권한을 변경해주면 자동으로 등록됩니다.

    sudo chmod 664 /opt/bitnami/wordpress/wp-config.php
    
    

    보안상  권한수정 변경에 민감하시다면

    아래처럼 직접 wp-config.php 파일에 입력하시면됩니다.

    vi /opt/bitnami/wordpress/wp-config.php