Go! Bbuwoo: Tech/프로그래밍 카테고리 글 목록https://my.oops.org/뭘 이런걸..2024-03-19T22:54:26+09:00Textcube 1.10.10 : Tempo primobaah:: getopt 사용 시 변수값 공백문자 처리김정균https://my.oops.org/2032023-05-24T13:08:55+09:002023-01-06T13:22:44+09:00정말 오랜만에 blog 에 posting 을 해 봅니다 :)<br /><br />bash 에서 옵션 처리를 할 경우, bash 의 내장 함수인 getopts 또는 GNU getopt 를 사용하게 되는데, 필자의 경우에는 long option 을 제공하는 GNU getopt 를 더 선호하는 편입니다.<br /><br />하지만 GNU getopt 를 사용할 경우 치명적인 문제가 하나 있는데, 바로 옵션 값에 공백 문자가 있을 경우, getopt -> set 을 하는 과정에서 옵션 값의 공백문자를 기준으로 분리가 되어 버리는 문제 입니다. (set 을 하는 이유는, 옵션과 인자값 순서를 섞어도 되게 하기 위해서 입니다.) 예를 들어<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>#!/bin/bash<br /><br />opts="$( getopt -o h -u -l help -- $@ )"<br />set -- ${opts}<br />echo "$@"<br />echo "$3"<br /></code></pre> 와 같이 코드를 만들고, 실행을 하면 다음과 같이 출력이 됩니다.<br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[user@host ~]$ bash test.sh -h "1 2 3"<br />-h -- 1 2 3<br />1<br /></code></pre> 출력되는 $3 은 기대하는 "1 2 3" 이 아니라 "1" 이 됩니다.<br /><br />그래서 이 문제는 해결하기 위해서는 다음과 같이 해 볼 수 있습니다.<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>#!/bin/bash<br /><br />for i<br />do<br /> [[ $i =~ [[:space:]] ]] && opt[n++]="\"${i}\"" || opt[n++]="${i}"<br />done<br />echo "input: ${opt[@]}"<br /><br />opts="$( eval getopt -o ah: -l aa,hhh: -- ${opt[@]} )"<br />echo "opts -> ${opts}"<br />eval set -- ${opts}<br />for i<br />do<br /> case "${i}" in<br /> -a|--aa)<br /> A=1<br /> shift<br /> ;;<br /> -h|--hhh)<br /> H="${2}"<br /> shift 2<br /> ;;<br /> --)<br /> shift;<br /> break<br /> esac<br />done<br /><br />echo "$@"<br />echo "----"<br />echo "-h -> $H"<br />echo "\$1 -> $1"<br />echo "\$2 -> $2"<br />echo "\$3 -> $3"<br />echo "\$4 -> $4"</code></pre> 결과는<br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[user@host ~]$ bash test.sh "123 456" -h '\"abc def\"' 789<br />input: -h "\"abc def\"" "123 456" 789<br />opts -> -h '"abc def"' -- '123 456' '789'<br />123 456 789<br />----<br />-h -> "abc def"<br />$1 -> 123 456<br />$2 -> 789<br />$3 -><br />$4 -></code></pre><br /><br />--<br />코드를 조금 더 업데이트 해 보았습니다. 옵션값이 quote 를 사용할 떄 escape 를 해야 했는데 불편해서 하지 않아도 되도록 개선해 보았습니다. 이 이슈 때문에 getopt 를 eval 을 했었는데 굳이 하지 않아도 되었더군요. ㅠ<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>#!/bin/bash<br /><br />echo "input: $@"<br /><br />opts="$( getopt -o ah: -l aa,hhh: -- "$@" )"<br />echo "opts -> ${opts}"<br />eval set -- "${opts}"<br /><br />echo "input -> ${opts}"<br /><br />for i<br />do<br /> case "${i}" in<br /> -a|--aa)<br /> A=1<br /> shift<br /> ;;<br /> -h|--hhh)<br /> H="${2}"<br /> shift 2<br /> ;;<br /> --)<br /> shift;<br /> break<br /> esac<br />done<br /><br />echo "$@"<br />echo "----"<br />echo "-h -> $H"<br />echo "\$1 -> $1"<br />echo "\$2 -> $2"<br />echo "\$3 -> $3"<br />echo "\$4 -> $4"</code></pre>이렇게 하면 옵션값에 quote 를 사용할 때 escape 를 하지 않아도 됩니다.<br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[user@host ~]$ bash test.sh 123\ 456 -h '"abc def"' 789<br />iinput: 123 456 -h "abc def" 789<br />opts -> -h '"abc def"' -- '123 456' '789'<br />input -> -h '"abc def"' -- '123 456' '789'<br />123 456 789<br />----<br />-h -> "abc def"<br />$1 -> 123 456<br />$2 -> 789<br />$3 -><br />$4 -></code></pre><p><strong><a href="https://my.oops.org/203?commentInput=true#entry203WriteComment">댓글 쓰기</a></strong></p>bash :: human readable size code김정균https://my.oops.org/2012021-01-13T11:55:52+09:002021-01-13T11:45:26+09:00디스크 크기나 네트워크 전송 대역폭 등을 단위대로 보기 좋게 하기 위한 코드를 살펴보겠습니다.<br />C나 여러 언어로 많이 있으나, bash 로는 딱히 마음에 드는 코드가 없어 만들어 보았습니다.<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>HUMANREADABLE_SIZE_SUFFIX=( "B" "KB" "MB" "GB" "TB" )<br /># HUMANREADABLE_SIZE req_size base_suffix<br />function HUMANREADABLE_SIZE {<br /> local suffix=${2:-0}<br /> local size=$1<br /> local isize=${size}<br /><br /> while [ 1 ]<br /> do<br /> (( isize < 1024 )) && break<br /> size="$( bc <<< "scale = 2; ${size} / 1024" )"<br /> isize=${size%%.*}<br /> let "suffix += 1"<br /> done<br /><br /> echo "${size} ${HUMANREADABLE_SIZE_SUFFIX[suffix]}"<br />}<br /></code></pre><br /><br />사용법은 간단합니다.<br /><br />HUMANREADABLE_SIZE 입력_숫자 입력단위(0-B,1-KB,2-MB,3-GB)<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code><br />[root@host ~]# # convert 1024 B<br />[root@host ~]# HUMANREADABLE_SIZE 1024<br />1KB<br />[root@host ~]# # convert 1024 KB<br />[root@host ~]# HUMANREADABLE_SIZE 1024 1<br />1MB<br />[root@host ~]# # convert 1024 MB<br />[root@host ~]# HUMANREADABLE_SIZE 1024 2<br />1GB<br />[root@host ~]# # convert 1024 GB<br />[root@host ~]# HUMANREADABLE_SIZE 1024 3<br />1TB<br /></code></pre><br /><br />변환 값을 변수로 받고 싶다면 다음과 같이 할 수 있습니다.<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code><br />[root@host ~]# SIZE=$( HUMANREADABLE_SIZE 1024 3 )<br />[root@host ~]# echo -n ${SIZE} # newline 이 없어야 할 경우.. <br /></code></pre><p><strong><a href="https://my.oops.org/201?commentInput=true#entry201WriteComment">댓글 쓰기</a></strong></p>bash version compare김정균https://my.oops.org/1982020-12-20T06:19:37+09:002020-06-08T16:41:04+09:00만들 때 마다 헷갈리고 까먹어서 기록해 놓아야 겠다.<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code># USAGE: compare_version OLD NEW<br /># RETURN:<br /># (OLD == NEW) return 0<br /># (OLD < NEW) return 1<br /># (OLD > NEW ) return 2<br />function compare_version {<br /> local opt<br /> [[ $1 == $2 ]] && return 0<br /><br /> # -V option 이 지원되지 않을 경우, 숫자 이외의 문자가 들어간 버전 비교가<br /> # 정확하지 않을 수 있다. 예) 2.1.9-3el6_7.2<br /> sort -V >& /dev/null <<< "aa"<br /> [[ $? == 0 ]] && opt="V"<br /><br /> test "$(printf '%s\n' "$@" | sort -r${opt} | head -n 1)" != "$1";<br /> res=$?<br /> [[ $res == 0 ]] && return 1 || return 2<br />}</code></pre><br /><br />결과<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[root@host ~]# source version_comapre.sh<br />[root@host ~]# compare_version 3 3<br />0<br />[root@host ~]# compare_version 3 4<br />1<br />[root@host ~]# compare_version 4 3<br />2<br />[root@host ~]#</code></pre><p><strong><a href="https://my.oops.org/198?commentInput=true#entry198WriteComment">댓글 쓰기</a></strong></p>bash 로 sort -V (version sort) 구현하기김정균https://my.oops.org/1972021-01-13T11:53:16+09:002020-01-16T18:47:17+09:00서버를 관리하다 보면 legacy OS 까지 고려하면서 코드를 작성해야 할 경우가 종종 있습니다.<br /><br />스크립팅을 하다 보면 sort -V 옵션을 종종 사용해야 할 경우가 있습니다. 그런데 old OS 에 있는 sort 는 -V 옵션이 없는 경우가 있을 수 있습니다.<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>[root@host ~]# sort --help | grep -- "-V"<br /> -V, --version-sort natural sort of (version) numbers within text<br />[root@host ~]#</code></pre><br />sort -V 옵션이 필요한 경우는 대부분 다음과 같습니다.<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>cat << EOL | sort<br />1<br />2<br />10<br />20<br />EOL<br /></code></pre><br />위의 코드의 결과로는 보통은 1.. 2.. 10 .. 20 의 순서대로 나오기를 기대하게 됩니다. 하지만 위의 코드 결과는 실제<br /><br /><pre class="prettyprint " style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>1<br />10<br />2<br />20</code></pre><br />과 같이 의도하지 않는 출력이 되게 됩니다. 그러다 보니 어쩔수 없이 sort -V 를 구현을 해야 하게 됩니다.<br /><br />아래 코드는 sort -V 옵션을 bash function 으로 만든 것입니다. license 는 BSD 2 clause 로 사용해 주시면 됩니다.<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>function sortv {<br /> local var<br /> local i<br /><br /> if [[ $# == 0 ]]; then<br /> i=0<br /> while read var_t<br /> do<br /> var[i++]="${var_t}"<br /> done < /dev/stdin<br /> else<br /> var=( $* )<br /> fi<br /><br /> (<br /> for i in ${var[@]}<br /> do<br /> printf "ibase=2; %07d\n" "$(bc <<< "obase=2; ${i}")"<br /> done<br /> ) | sort | bc<br />}<br /><br />sort -V 2> /dev/null <<< "1"<br />[ $? -eq 0 ] && sort="sort -V" || sort="sortv"<br /><br />cat <<EOL | ${sort}<br />1<br />10<br />2<br />20<br />EOL</code></pre><br />출력 결과는 <br /><br /><pre class="prettyprint " style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>1<br />2<br />10<br />20</code></pre><br /><br />P.S.<br />기존의 sortv 함수가 문자열이나 공백이 들어갈 경우 문제가 되어 개선을 해 보았습니다.<br /><br /><pre class="prettyprint bash" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>function sortv {<br /> local var<br /> local i<br /> if [[ $# == 0 ]]; then<br /> i=0<br /> while read var_t<br /> do<br /> var[i++]="${var_t}"<br /> done < /dev/stdin<br /> else<br /> var=( $* )<br /> fi<br /><br /> (<br /> for i in "${var[@]}"<br /> do<br /> perl -p -e 's/([0-9]{4})/$1#~~#/g; s/([0-9]+)/`bc <<< "obase=2; $1" | xargs printf "%020d~~"`/eg' <<< "${i}"<br /> done<br /> ) | sort | perl -pe 's/([0-9]{20})~~/`bc <<< "ibase=2; $1" | xargs printf "%s"`/eg; s/[0-9]{4}#~~#/$1/g'<br />}<br /><br />sort -V 2> /dev/null <<< "1"<br />[ $? -eq 0 ] && sort="sort -V" || sort="sortv"<br /><br />cat <<EOL | ${sort}<br />/home/0 asdfdsakf298u098uop;<br />/home/2 asdfdsakf298u097uop;<br />/home/5 asdfdsakf298u098uop;<br />/home/4 asdfdsakf298u098uop;<br />/home/11 asdfdsakf298u098uop;<br />/home/3 asdfdsakf298u028uop;<br />/home/1<br /><span style="font-size: 15.008px;">EOL</span></code></pre><br />출력 결과는 <br /><span style="font-size: 15.008px;"><br /><pre class="prettyprint " style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code></span>/home/0 asdfdsakf298u98uop;<br />/home/1<br />/<span style="font-size: 15.008px;">home</span>/2 asdfdsakf298u97uop;<br />/<span style="font-size: 15.008px;">home</span>/3 asdfdsakf298u28uop;<br />/<span style="font-size: 15.008px;">home</span>/4 asdfdsakf298u98uop;<br />/<span style="font-size: 15.008px;">home</span>/5 asdfdsakf298u98uop;<br />/<span style="font-size: 15.008px;">home</span>/11 asdfdsakf298u98uop;<span style="font-size: 15.008px;"></code></pre></span><p><strong><a href="https://my.oops.org/197?commentInput=true#entry197WriteComment">댓글 쓰기</a></strong></p>iPuTTY 0.71 준비김정균https://my.oops.org/1932019-03-24T04:21:08+09:002019-03-24T04:20:40+09:003/17 에 putty 0.71 이 release 가 되었네요. iPuTTY 0.71 release 를 시작 해야겠습니다.<br /><br />0.70 에서 0.71 release 되기 까지 꽤 오랜 시간이 되었고, commit 양도 어마어마하네요. iPuTTY 에 반영한 변경 사항이 잘 merge가 될지 모르겠습니다. 좀 자주 release 해 주는게 merge 하는데는 더 편할 수도 있을 것 같네요.<p><strong><a href="https://my.oops.org/193?commentInput=true#entry193WriteComment">댓글 쓰기</a></strong></p>현재 OS가 VM 인지 확인김정균https://my.oops.org/1922020-12-20T06:19:02+09:002019-01-30T13:30:40+09:00현재 접속해 있는 host가 vm guest 인지 아닌지 여부를 확인 하는 방법은 보통 다음과 같다.<br /><br />1. dmidecode 에서 Xen 또는 VMware 가 있는지 찾기<br />2. Xen guest의 CentOS 6 이하는 dmidecode를 제대로 지원하지 않는 경우가 많은데, 이 경우에는 ps 명령에서 xenbus 를 찾는 방법이 있다.<br /><br />여기서 논하는 방법은 CPU ID를 확인하는 방법인데, <a href="https://kb.vmware.com/s/article/1009458">VMWare 문서</a>에 의하면 다음과 같이 소개하고 있다.<br /><br />
<blockquote><span style="font-size: 10pt;">Intel 및 AMD의 CPU는 CPUID 리프 0x1의 ECX의 비트 31을 하이퍼 바이저 존재 비트로 예약하고 있습니다. 이 비트에 의해 하이퍼 바이저는 게스트 OS에 그 존재를 나타낼 수 있습니다. 하이퍼 바이저는이 비트를설정하여 실제 CPU (모든 기존 CPU와 장래의 CPU)는이 비트를 0으로 설정합니다. 게스트 OS는 31 비트를테스트하여 그 하이퍼 바이저가 가상 머신 내에서 실행되고 있는지를 확인할 수 있습니다.</span><br /><br /><span style="font-size: 10pt;">Intel 및 AMD는 소프트웨어에서 사용할 수 있도록 CPUID 리프 0x40000000 ~ 0x400000FF도 예약하고 있습니다. 하이퍼 바이저는 이러한 리프를 사용하여 하이퍼 바이저에서 가상 머신 내에서 실행되는 게스트 OS에 정보를 전달하기위한 인터페이스를 제공 할 수 있습니다. 하이퍼 바이저 비트는 하이퍼 바이저가 존재하는 것을 의미하며 이러한 추가 소프트웨어 리프를 테스트하는 것이 안전하다는 것을 보여줍니다. VMware는 0x40000000 리프를 하이퍼 바이저 CPUID 정보 리프로 정의합니다. VMware 하이퍼 바이저 코드를 실행함으로써 하이퍼바이저 서명이 있는지 CPUID 정보 리프를 테스트 할 수 있습니다. VMware는 CPUID 리프 0x40000000의 EBX, ECX, EDX에 "VMwareVMware"라는 문자열을 저장합니다.</span></blockquote>
<br />이 내용을 C code 로 만들면 다음과 같다.<br /><br /><pre class="prettyprint c" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code><br />#include <stdio.h><br />#include <string.h><br /><br />// https://stackoverflow.com/questions/6491566/getting-the-machine-serial-number-and-cpu-id-using-c-c-in-linux<br />static inline void cpuid (unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx)<br />{<br /> /* ecx is often an input as well as an output. */<br /> asm volatile (<br /> "cpuid"<br /> : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)<br /> : "0" (*eax), "2" (*ecx)<br /> );<br />}<br /><br />// https://kb.vmware.com/s/article/1009458<br />int cpuid_check (void) {<br /> unsigned int eax, ebx, ecx, edx;<br /> char hyper_vendor_id[13];<br /> //cpuid(0x1, &eax, &ebx, &ecx, &edx);<br /> eax = 0x1;<br /> cpuid (&eax, &ebx, &ecx, &edx);<br /><br /> // bit 31 of ecx is set<br /> // 0x8000000 10000 0000 0000 0000 0000 0000 0000 0000<br /> if ( ecx >= 0x80000000 ) {<br /> //cpuid(0x40000000, &eax, &ebx, &ecx, &edx);<br /> eax = 0x40000000;<br /> cpuid (&eax, &ebx, &ecx, &edx);<br /> memcpy (hyper_vendor_id + 0, &ebx, 4);<br /> memcpy (hyper_vendor_id + 4, &ecx, 4);<br /> memcpy (hyper_vendor_id + 8, &edx, 4);<br /> hyper_vendor_id[12] = '\0';<br /><br /> //printf ("This is GuesVM %s\n");<br /> //printf ("##################### %s\n", hyper_vendor_id);<br /><br /> // VMwareVMware<br /> if ( ! strncmp (hyper_vendor_id, "VMware", 6) )<br /> return 0; // Success - running under VMware<br /> // XenVMMXenVMM<br /> else if ( ! strncmp (hyper_vendor_id, "XenVM", 5) )<br /> return 0; // Success - running under Xen<br /> }<br /><br /> return 1;<br />}<br /><br />int main (void) {<br /> // if guest vm return 0 and case others, return 1<br /> return cpuid_check ();<br />}<br /></code></pre><br /><br />이 코드는 VMWare EX 5.1 이상에서 정상 동작 함을 확인 했고, Xen server의 경우 7 에서 정상 동작하며, Xen server 6.5의 경우 CentOS 6.x 이하에서는 CPU id 에서 해당 영역값을 읽어오지 못한다. 즉, legacy system에서는 동작하지 않을 수 있다.<p><strong><a href="https://my.oops.org/192?commentInput=true#entry192WriteComment">댓글 쓰기</a></strong></p>iPuTTY 0.70.2 release김정균https://my.oops.org/1912018-10-07T21:56:52+09:002018-10-07T21:54:30+09:00iPuTTY 0.70.2 release 소식 입니다.<br /><br />왠만하면 PuTTY 0.71 을 기다리려고 하고 있는데, release 될 생각이 없는 듯 싶네요. 뭐 PuTTY 가 거의 보안버그 나올 경우만 업데이트 되는 경향이 강해서.. 0.61 출시 때 처럼 몇년이 걸릴지 모르겠습니다.<br /><br />그래서 일단, iPuTTY의 기능에 대한 업데이트로 release 를 합니다.<br />0.70.2 의 주요 내용은, ZMODEM 기능 개선이며, 드디어 Drag & Drop 으로 ZMODEM 파일 전송이 가능해졌습니다.<br /><br />ZMODEM 사용법에 대해서는 <a href="https://github.com/iPuTTY/iPuTTY/wiki">https://github.com/iPuTTY/iPuTTY/wiki</a> 의 ZMODEM 항목을 참고 하세요.<br /><br /><span style="background-color: #999999; color: #ffffff;"><em><strong>Download:</strong></em></span> <a href="https://github.com/iPuTTY/iPuTTY/releases/tag/l0.70.1i">https://github.com/iPuTTY/iPuTTY/releases/tag/l0.70.2i</a><br /><br /><strong><strong><em><span style="font-size: 14pt;">Changes:</span></em><br /></strong></strong><hr />
<ul style="list-style-type: disc;">
<li>ZMODEM Drag & Drop 지원 (<a class="issue-link js-issue-link tooltipped tooltipped-ne" href="https://github.com/iPuTTY/iPuTTY/issues/41" data-error-text="Failed to load issue title" data-id="330891970" data-permission-text="Issue title is private" data-hovercard-type="issue" data-hovercard-url="/iPuTTY/iPuTTY/issues/41/hovercard">#41</a>)</li>
<li>ZMODEM 의 sz 파일 경로 체크 오류 수정 (<a class="issue-link js-issue-link tooltipped tooltipped-ne" href="https://github.com/iPuTTY/iPuTTY/issues/40" data-error-text="Failed to load issue title" data-id="330887897" data-permission-text="Issue title is private" data-hovercard-type="issue" data-hovercard-url="/iPuTTY/iPuTTY/issues/40/hovercard">#40</a>)</li>
</ul><p><strong><a href="https://my.oops.org/191?commentInput=true#entry191WriteComment">댓글 쓰기</a></strong></p>iPuTTY 0.70.1 release김정균https://my.oops.org/1892018-10-07T21:55:05+09:002018-04-29T22:23:21+09:000.70.1 release 소식 입니다.<br /><br />0.70.1 은 iPuTTY 수정 사항에 대한 bug 나 신 기능에 대한 업데이트 입니다.<br /><br /><span style="background-color: #999999; color: #ffffff;"><em><strong>Download:</strong></em></span> <a href="https://github.com/iPuTTY/iPuTTY/releases/tag/l0.70.1i">https://github.com/iPuTTY/iPuTTY/releases/tag/l0.70.1i</a><br /><br /><span style="font-size: 14pt;"><em><strong>Changes:<br /></strong></em></span><hr /><br />
<ul>
<li>Vista 이후 사용되지 않는 <em><strong>ONTHESPOT</strong></em> 패치 코드 제거 (<a class="issue-link js-issue-link" href="https://github.com/iPuTTY/iPuTTY/issues/20" data-error-text="Failed to load issue title" data-id="231956684" data-permission-text="Issue title is private" data-url="https://github.com/iPuTTY/iPuTTY/issues/20">#20</a>)</li>
<li>OTP와 같은 <em><strong>2 단계 인증</strong></em> 시에 저장되어 있는 암호가 잘못 입력 되는 문제 수정 (<a class="issue-link js-issue-link" href="https://github.com/iPuTTY/iPuTTY/issues/31" data-error-text="Failed to load issue title" data-id="259893931" data-permission-text="Issue title is private" data-url="https://github.com/iPuTTY/iPuTTY/issues/31">#31</a>)</li>
<li>명령행으로 실행 시에, 파일 세션을 불러오지 못하는 문제 수정 (<a class="issue-link js-issue-link" href="https://github.com/iPuTTY/iPuTTY/issues/33" data-error-text="Failed to load issue title" data-id="314210945" data-permission-text="Issue title is private" data-url="https://github.com/iPuTTY/iPuTTY/issues/33">#33</a>)</li>
<li>명령행으로 실행 시에, <em><strong>ssh:</strong></em> 와 <em><strong>putty:</strong></em> 지원 (<a class="issue-link js-issue-link" href="https://github.com/iPuTTY/iPuTTY/issues/35" data-error-text="Failed to load issue title" data-id="314342071" data-permission-text="Issue title is private" data-url="https://github.com/iPuTTY/iPuTTY/issues/35">#35</a>)</li>
<li>ZMODEM 단축키 지원 (<a class="issue-link js-issue-link tooltipped tooltipped-ne" href="https://github.com/iPuTTY/iPuTTY/issues/36" data-error-text="Failed to load issue title" data-id="314352619" data-permission-text="Issue title is private">#36</a>) - 받기 <em><strong>F11</strong></em> / 보내기 <em><strong>F12</strong></em></li>
<li>MacOS의 SSH server로 로그인 시에, NFC 문제로 한글이 깨져 보이는 문제 수정 (<a class="issue-link js-issue-link" href="https://github.com/iPuTTY/iPuTTY/pull/38" data-error-text="Failed to load issue title" data-id="314836082" data-permission-text="Issue title is private" data-url="https://github.com/iPuTTY/iPuTTY/issues/38">#38</a>)</li>
<li>암호 저장시에, 암호 길이가 3의 배수일 경우 로그인 실패하는 문제 수정 (<a class="issue-link js-issue-link tooltipped tooltipped-ne" href="https://github.com/iPuTTY/iPuTTY/issues/39" data-error-text="Failed to load issue title" data-id="315116749" data-permission-text="Issue title is private">#39</a>)</li>
</ul>
<br /><br /><br /><p><strong><a href="https://my.oops.org/189?commentInput=true#entry189WriteComment">댓글 쓰기</a></strong></p>iPuTTY 0.70 release김정균https://my.oops.org/1842017-07-25T00:13:20+09:002017-07-25T00:12:25+09:00<span style="font-size: 15.008px;">0.70 release 소식 입니다.</span><br /><br /><strong>iPuTTY 업데이트 사항:</strong><br />
<ul style="font-size: 15.008px;">
<li style="box-sizing: border-box;">fixed <a class="issue-link js-issue-link" style="box-sizing: border-box; background-color: transparent; color: #0366d6; text-decoration-line: none;" title="wrong translation" href="https://github.com/iPuTTY/iPuTTY/issues/27" data-id="239146005" data-error-text="Failed to load issue title" data-permission-text="Issue title is private">#27</a> wrong translattion</li>
<li style="box-sizing: border-box; margin-top: 0.25em;">fixed <a class="issue-link js-issue-link" style="box-sizing: border-box; background-color: transparent; color: #0366d6; text-decoration-line: none;" title="Fixedsys 폰트의 사용 on windows 10" href="https://github.com/iPuTTY/iPuTTY/issues/28" data-id="242566176" data-error-text="Failed to load issue title" data-permission-text="Issue title is private">#28</a> Fixedsys 폰트의 사용 on windows 10</li>
<li style="box-sizing: border-box; margin-top: 0.25em;">fixed <a class="issue-link js-issue-link" style="box-sizing: border-box; background-color: transparent; color: #0366d6; text-decoration-line: none;" title="Hanterm key map 추가" href="https://github.com/iPuTTY/iPuTTY/issues/30" data-id="243193066" data-error-text="Failed to load issue title" data-permission-text="Issue title is private">#30</a> add Hanterm key map</li>
<li style="box-sizing: border-box; margin-top: 0.25em;">pscp의 기본 문자셋을 cp949에서 utf-8로 변경 (<a class="commit-link" style="box-sizing: border-box; background-color: transparent; color: #0366d6; text-decoration-line: none;" href="https://github.com/iPuTTY/iPuTTY/commit/1e68e28b4106b16e86c654c94d219d21fd0afa38"><tt style="box-sizing: border-box; font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0px; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;">1e68e28</tt></a>)</li>
</ul>
<strong>PuTTY 업데이트 사항:</strong><br />
<ul>
<li>Security fix: the Windows PuTTY binaries should no longer be vulnerable to hijacking by specially named DLLs in the same directory, even a name we missed when we thought we'd fixed this in 0.69. See <a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/vuln-indirect-dll-hijack-3.html">vuln-indirect-dll-hijack-3</a>.</li>
<li>Windows PuTTY should be able to print again, after our DLL hijacking defences broke that functionality.</li>
<li>Windows PuTTY should be able to accept keyboard input outside the current code page, after our DLL hijacking defences broke that too.</li>
</ul>
<br /><span style="font-size: 15.008px;">릴리즈 패키지는 </span><a style="font-size: 15.008px;" href="https://github.com/iPuTTY/iPuTTY/releases/tag/l0.70i">https://github.com/iPuTTY/iPuTTY/releases/tag/l0.70i</a><span style="font-size: 15.008px;"> 에서 제공 합니다.</span><p><strong><a href="https://my.oops.org/184?commentInput=true#entry184WriteComment">댓글 쓰기</a></strong></p>iPuTTY 0.69.1 release김정균https://my.oops.org/1822017-06-26T00:35:33+09:002017-06-26T00:33:38+09:000.69.1 release 소식 입니다.<br /><br />
<ul>
<li><a href="https://ko.wikipedia.org/wiki/Z%EB%AA%A8%EB%8E%80">ZMODEM</a> 기능 지원
<ul>
<li><a href="https://github.com/iPuTTY/iPuTTY">iPuTTY</a> console을 이용하여 파일 업로드/다운로드를 지원 합니다.</li>
</ul>
</li>
<li>세션별 암호 저장 기능 지원</li>
<li>pagent icon을 <a href="https://puttytray.goeswhere.com/">PuTTYTray</a> icon으로 변경</li>
<li>자세한 사항은 아래의 <a href="https://github.com/iPuTTY/iPuTTY/releases/tag/l0.69.1i">Release page</a>를 참고 하십시오.</li>
</ul>
<br />릴리즈 패키지는 <a href="https://github.com/iPuTTY/iPuTTY/releases/tag/l0.69.1i">https://github.com/iPuTTY/iPuTTY/releases/tag/l0.69.1i</a> 에서 제공 합니다.<p><strong><a href="https://my.oops.org/182?commentInput=true#entry182WriteComment">댓글 쓰기</a></strong></p>iPuTTY ZMODEM 지원김정균https://my.oops.org/1812017-06-12T03:41:01+09:002017-06-12T03:40:18+09:00LePuTTY의 ZMODEM 기능을 iPuTTY에 포팅을 했습니다.<br /><br />일단, 동작은 잘 하는 것 같네요. 좀 더 사용해 보고 문제가 없으면 0.69.1 로 릴리즈 할 예정 입니다. 그전에 PuTTY 0.70이 나오면 0.70으로 릴리즈 될 것이고요 :-)<br /><br /><a href="https://github.com/iPuTTY/iPuTTY/pull/25">https://github.com/iPuTTY/iPuTTY/pull/25</a><br /><br />참고 하세요.<p><strong><a href="https://my.oops.org/181?commentInput=true#entry181WriteComment">댓글 쓰기</a></strong></p>iPuTTY 0.69 release김정균https://my.oops.org/1802017-06-26T00:34:25+09:002017-05-17T01:34:13+09:00어쩌다 보니 <strong>iPuTTY</strong> maintaing을 하게 되었습니다. 기존 관리자였던 김준기님이 작년에 project를 더이상 하지 않겠다고 project site에 공지를 올렸고, 비공식적으로 PuTTY 업데이트를 반영해서 사용하다가 그냥 제가 맡아서 하기로 하였습니다.<br /><br />어쩌다 보니, <span style="text-decoration: underline;">뒷처리 담당자로서 우뚝선 느낌</span>입니다. :-)<br /><br />어쨌든 4/29에 릴리즈된 PuTTY 0.69의 대응 버전을 릴리즈 했으며, 추가적으로 기능을 좀 더 강화 했습니다. 솔직히 GUI programing이 처음이고 PuTTY 코드를 제대로 본 것도 아니라서 잘 유지할 수 있을지 모르겠지만, 나서는 사람이 없어 일단 제가 총대를 매게 되었습니다. (<span style="text-decoration: line-through;">아쉬운 사람이 해야 하는 관계로 T.T</span>)<br /><br />project 사이트는 <strong>bitbucket</strong>에서 <strong>GitHub</strong>로 이전을 했으며, https://github.com/iPuTTY/iPuTTY/wiki 를 이용하면 되겠습니다.<br /><br />0.69 에서 제공하는 기능은 다음과 같습니다.<br /><br />
<ul>
<li><strong>한글 UI 제공</strong>
<ul>
<li>다시 한글 UI를 제공 하며, pagent, puttygen, pscp, psftp 등 <span style="text-decoration: underline;">모든 프로그램에서 한글 UI를 제공</span> 합니다.</li>
</ul>
</li>
<li><strong>이제 64bit binary를 제공 합니다.</strong></li>
<li><strong>psftp 와 pscp 에서 UTF-8을 사용할 수 있습니다.</strong></li>
<li><strong>한글 입력 모드에서 Esc를 누르면 자동으로 영문 입력 모드로 변경이 됩니다.</strong></li>
<li><strong>서버 호스트키 체크 여부 옵션이 추가 되었습니다.</strong></li>
<li><strong>Cygterm backend 가 추가 되었습니다.</strong></li>
<li><strong>psftp 에서 ls 명령으로 개별 file 목록을 볼 수 없는 버그를 수정했습니다.</strong></li>
</ul>
<br />자세한 사항은 <span style="font-size: 15.008px;">https://github.com/iPuTTY/iPuTTY/wiki 를 참고 하세요.</span><p><strong><a href="https://my.oops.org/180?commentInput=true#entry180WriteComment">댓글 쓰기</a></strong></p>PHP 소스 코드 암호화 (php_screw 개선)김정균https://my.oops.org/1722016-11-30T13:37:24+09:002016-11-30T01:36:28+09:00<font size="2">요즘 IT 업계에서 보안이 화두이기는 한 것 같습니다. 지인에게서 ISMS 인증이 빡세어 졌다는 등의 소식도 있고..<br><br>근래 free lancer로 일을 하면서 진행하는 project에서도 역시 보안이 화두인가 봅니다. project 마무리를 하고 있는 상황에서, 갑자기 설정 파일을 암호화를 해 달라는 요청을 받았습니다. 그것도 다른 파일들은 나두고 설정 파일만..<br><br>대충 복호화가 가능한 알고리즘을 이용해서 <del>eval로 실행을 시킬까 고민을 잠시 하기는 했었는데,</del> 영 eval 은 아닌 것 같고 검색을 해 보니 <strong>php_screw</strong> 라는 것이 보이더군요. 그래서 이 놈을 사용하려고 code를 좀 살펴 보았는데, 좀 걸리는 부분들이 많더군요.<br><br></font><ol><li><font size="2"><a href="https://github.com/dehydr8/php_unscrew" target="_blank">php_unscrew</a>로 복호화가 가능하다.<br></font></li><li><font size="2">decode api (zencode.c) 에서 전역 변수를 사용하여 thread safe 하지 못하다. (프로젝트와는 상관이 없지만...)</font></li><li><font size="2">복호시에 temp file을 생성한다.</font></li><li><font size="2">decode 시에 memory realloc을 너무 자주 한다. 사이즈가 큰 암호화 파일의 경우 성능을 떨어뜨릴 수 있다.</font></li><li><font size="2">파일 몇 개를 암호화 하기 위해서, 모든 파일의 magic key 체크를 한다.</font></li></ol><font size="2"><br>등등.. 복호화 문제와 성능의 문제가 고민이 되었습니다. <br><br>성능의 문제의 경우, 처음 <strong>php_screw</strong>를 살펴 보던 시점에서는 opcode cache를 고려하지 않았고 또한 테스트를 해 보지 않은지라 성능상의 문제가 좀 커 보였었던 점이 있습니다. 지금 시점에서 말하자면, <ins><strong>opcache</strong>나 <strong>APC</strong>와 같은 PHP code cache 프로그램을 이용하면, magic key 체크, decode 등의 이슈는 상당히 많이 줄어들게 됩니다.</ins><br><br>다만, 하고 있는 프로젝트가 순간 폭주가 가능한 서비스인지라, cache time이 짧을 경우 문제가 될 소지가 있었고, 또한 php_uncrew에 의한 복호화의 문제도 있어 어쩔수 없이 코드를 건드리게 되었고, <strong>mod_screwim</strong> (PHP Screw Improved)라는 fork 버전을 릴리즈 했습니다.<br><br>대략적인 개선 사항은, 다음과 같습니다.<br><br></font><ol><li><font size="2">temp flie을 생성하는 방식에서 <a href="http://enjoytools.net/xe/board_nfRq49/2018" target="_blank">신성욱님의 개선사항</a>을 반영하여 PHP memstream을 이용한 방식으로 개선</font></li><ol><li><font size="2">개선 사항에 있던 memory leak 수정</font></li><li><font size="2">반환값이 없을 경우 segfault 발생하는 문제 수정</font></li><li><font size="2">파일을 2번 open 하는 버그 수정</font></li></ol><li><font size="2">전역 변수를 없애 thread safe하도록 수정</font></li><li><font size="2">memory reallocation 로직을 수정하여 사이즈가 큰 암호화된 파일을 decode 시에 성능 개선</font></li><li><font size="2">암호화 SEED key 자동 random 생성</font></li><li><font size="2">screwim.enable ini 옵션이 enable 상태에서만 decodeing을 한다. (ini_set 이용 가능하며, magic key 검사 이슈)</font></li><li><font size="2">runtime encrypt/decrypt API 제공 (screwim_encrypt(), screwim_decrypt(), screwim_seed())</font></li><li><font size="2"><a href="https://github.com/dehydr8/php_unscrew" target="_blank">php_unscrew</a> 방식의 복호화를 어렵게 수정</font></li></ol><font size="2"><br>뭐, 그 외에도 자잘한 것들이 있기는 하지만 그리 중요한 것 같지는 않고, 자세한 사항은 <a href="https://github.com/OOPS-ORG-PHP/mod_screwim/">https://github.com/OOPS-ORG-PHP/mod_screwim/</a> 을 참고 하시기 바랍니다.<br><br>그리고, 이 모듈(<strong>mod_screwim</strong>)을 사용하려면 (또는 <strong>php_screw</strong>를 사용하려면) 꼭 (opcache 또는 APC 같은..) cache를 같이 사용해야 <ins>decode 시의 성능 손실을 최소화 할 수 있습니다</ins>.</font><p><strong><a href="https://my.oops.org/172?commentInput=true#entry172WriteComment">댓글 쓰기</a></strong></p>VIM PHP switch indent김정균https://my.oops.org/1712016-07-08T18:34:23+09:002016-07-08T17:50:27+09:00VIM 에서 PHP를 작성할 때, indent 기능을 사용할 경우 switch가 아래와 같이 정렬이 됩니다. <br /><br /><pre class="prettyprint php" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code><?php <br />switch ($a) { <br />case '1' : <br /> echo "1\n"; <br /> break; <br />default : <br /> echo "12\n"; <br />} <br />?></code></pre><br /><br />즉, case 문의 depth가 switch와 동일하게 되는 현상인데, 이걸 싫어 하는 사람도 많습니다. 그래서 case를 indent 시키고 싶다면 .vimrc 에 다음의 설정을 추가해 주세요.<br /><br /><pre class="prettyprint " style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>let g:PHP_vintage_case_default_indent = 1</code></pre><br /><br />그리고 다시 indent 시켜 보면 다음과 같이 정렬이 됩니다.<br /><br /><pre class="prettyprint php" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code><?php<br />switch ($a) {<br /> case '1' :<br /> echo "1\n";<br /> break;<br /> default :<br /> echo "2\n";<br />}<br />?></code></pre><br /><br /><p><strong><a href="https://my.oops.org/171?commentInput=true#entry171WriteComment">댓글 쓰기</a></strong></p>PHP 7 third party extension migration김정균https://my.oops.org/1672016-07-08T18:43:08+09:002015-12-29T05:15:46+09:00안녕 리눅스 3의 PHP 버전을 7로 올려서 release 하려고 하다보니.. 별 개삽질을 다하고 있다.<br />일단, PHP wiki에서 https://wiki.php.net/phpng-upgrading 를 참고하여 작업을 하면 되는데, 문제는 여기에 나와있지 않은 경우가 너무나 많다.<br /><br />결국에는 PHP 소스 코드를 뒤져서 구현해야 하는.. 더군다나 여기에 나와있지 않은 hole들도 굉장히 많다. 대표적으로..<br /><br />
<pre class="prettyprint lang-c" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>char * input;
int ilen;
int no;
if ( zend_parse_parameters (ZEND_NUM_ARGS(), "sl", &input, &ilen, &no) == FAILURE )
RETURN_FALSE;
</code></pre>
이 코드는 컴파일을 잘 되나, 그냥 segfault 가 발생한다. s(String)과 l(integer)는 다음과 같이 해 줘야 한다.<br /><br />
<pre class="prettyprint lang-c" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>zend_string * Zinput = NULL;
zend_long no;
char * input;
int ilen;
if ( zend_parse_parameters (ZEND_NUM_ARGS(), "Sl", &input, &no) == FAILURE )
RETURN_FALSE;
input = ZSTR_VAL (input);
ilen = ZSTR_LEN (input);
</code></pre>
zend_parse_parameters 에서 string은 zend_string으로 변경해 줘야 하고, long은 zend_long로 선언을 변경해 줘야 한다. 이 외에도, string을 zval 변수로 변환하는 경우도 짜증난 케이스<br /><br />
<pre class="prettyprint lang-c" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>zval *zv;
MAKE_STD_ZVAL (zv)
ZVAL_STRING (zv, "문자열");
</code></pre>
이 코드는 다음과 같이 변경 되어야 한다.
<pre class="prettyprint lang-c" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>zval zv;
ZVAL_STRING (&zv, "문자열");
,,,
zval_ptr_dtor (&zv);
</code></pre>
이 외에도 너무 많아서 정리가 힘들다. PHP7은 잘못하면 python 3 꼴이 날지도 모르겠다. 3party module 중에서 PHP 7을 지원을 얼마나 빨리 해 주ㄴ냐가 관건인 듯.. 물론 php code 호환 문제 까지는 바라보기도 전에 말이다. (갈 길이 너무 멀다....)
내가 만든 3party 확장들은 PHP 7 지원을 위한 코드 변경이 너무 많아서, 아예 PHP 7 지원하는 버전은 하위 호환성을 포기하고 컴파일을 막아 버렸다. --;
<pre class="prettyprint lang-c" style="overflow:auto;white-space:pre-wrap;white-space:-moz-pre-wrap;word-break:break-all;word-wrap:break-word;"><code>#if PHP_API_VERSION < 20151012
#error "************ PHP version dependency problems *******************"
#error "This package requires over php 7.0.0 !!"
#error "If you build with php under 7.0.0, use mod_krisp 2.x version"
#error "You can download mod_krisp 2.x at http://mirror.oops.org/pub/oops/libkrisp/APIs/php/"
#endif
</code></pre>
참고로.. <a href="http://svn.oops.org/wsvn/PHP.mod_korean?manualorder=1&op=comp&compare%5B0%5D=%2Ftrunk&compare_rev%5B0%5D=367&compare%5B1%5D=%2Ftrunk&compare_rev%5B1%5D=372&comparesubmit=%EA%B2%BD%EB%A1%9C+%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0" target="_blank">mod_korean migraion diff</a> 를 보면.. 얼마나 많이 변경을 해야 하는지 대충 감이 올 듯.. 이 링크는 아직도 작업이 완료되지 않은 상태이다. --;<p><strong><a href="https://my.oops.org/167?commentInput=true#entry167WriteComment">댓글 쓰기</a></strong></p>