드디어 마지막 단계입니다!

구축한 메일서버를 이용해서 실제로 메일을 보내보도록 하겠습니다@@@

현재 메일서버는 웹 메일은 구현되어있지 않고 오직 SMTP와 IMAP&POP3 로 구성되어있어

이메일을 사용하기 위해서는 별도의 이메일 클라이언트가 필요합니다.

저는 메일 클라이언트로 썬더버드라는 메일 클라이언트를 다운로드 받았습니다

위의 링크에서 클라이언트를 받고 설치해 줍니다.

보통 처음 썬더버를 설치한 이후에는 메일 계정을 추가하는 창이 뜨지만,

혹시 창이 뜨지않거나 취소하신 분들은 위의 사진처럼 계정 설정 -> 메일 을 눌러서 메일을 추가해 줍니다

메일 구축 1단계에서 생성하였던 계정 정보를 입력하고 계속을 누르면 썬더버드가 메일 서버를 찾습니다.

계속해서 완료 버튼을 누르면 메일 계정 추가가 완료 됩니다.

짜잔~ 위 사진처럼 성공적으로 메일 계정이 추가되면 쓰기버튼을 눌러서 메일을 작성해 보겠습니다

간단하게 메일 작성후 메일을 보냅니다.

잠시후 메일이 도착함을 확인할 수 있습니다! 물론 답장을 하게되면 썬더버드를 통해서 확인 하실 수 있습니다.

이상으로 메일 구축을 완료하였습니다!

따라오시느라 고생 많으셨고 질문이나 수정할 부분있으면

linux@mast3r.com이나 pawn@teem0.com으로 메일 보내 주시면 감사하겠습니다!

감사합니다~~~~~~!!!!!

이번 포스팅에서는 Dovecot을 설치하고 설정하도록 하겠습니다.

apt install dovecot-core dovecot-imapd dovecot-pop3d

제일 먼저 apt명령어로 Dovecot과 imap, pop3 데몬을 다운받아 줍니다.

vim /etc/dovecot/conf.d/10-mast3r.conf

다운로드가 완료되었으면 위의 파일을 수정할 것입니다.

unix_listener라는 항목을 몇번 지나다 보면 /var/spool/postfix/private/auth라는 섹션이 나오는데 그곳에서

user = postfix
group = postfix

이 두 항목을 추가시켜줍니다.

vim /etc/dovecot/conf.d/10-auth.conf

다음은 10-auth.conf 파일입니다. 인증방법을 설정하는 파일입니다.

disable_plaintext_auth는 평문인증을 비활성화 하는 옵션입니다.

auth_mechanisms 옵션을 찾아 뒤에 login옵션을 추가해 줍니다. 이를 추가해줌으로써 IMAP에서 로그인을 할 수 있게 됩니다.

vim /etc/dovecot/dovecot.conf

Dovecot의 메인 설정파일입니다.

protocols = pop3 imap

위 문장을 파일 제일 아래쪽에 적어주도록 합시다.

vim /etc/dovecot/conf.d/10-mail.conf

다음은 메일을 설정하는 파일입니다.

mail_location = maildir:~/Maildir

Postfix설정에서도 설정 해 줬듯이, Dovecot에서도 mail저장에 mbox대신에 /Maildir을 사용합니다.

vim /etc/dovecot/conf.d/20-pop3.conf

다음은 pop3를 설정하는 파일입니다.

pop3_uidl_format = %08Xu%08Xv

주석처리되어있는 위 라인의 주석을 해제 시켜줍니다.

vim /etc/dovecot/conf.d/10-ssl.conf

마지막으로 SSL 설정파일입니다.

위 사진과같이 ssl옵션에 yes를 주시고, ssl_cert와ssl_key의 경로에 저번에 Letsencrypt에서 생성되었던 파일들의 경로를 지정합니다.

이렇게 지정하면 모든 설정이 완료되었습니다.!

systemctl restart dovecot

마지막으로 dovecot을 재구동 해주면 dovecot설정이 완료됩니다.

다음 마지막 포스팅에서는 실제로 썬더버드를 사용해서 메일을 주고 받아보겠습니다!

이번 포스팅에서는 리눅스 머신에 postfix설치 설정 및 letsencrypt를 사용한 SSL 설정을 하겠습니다.

postfix를 설치하고 설정까지 마치면 SMTP프로토콜(메일발송 프로토콜)을 이용할 수 있습니다.

앞으로의 작업은 모두 라즈베리파이에서 이루어 지는 작업입니다.

자 그럼 시작하도록 하겠습니다ㅋㅋ

제일 먼저 라즈베리파이에 로그인을 합니다,

apt install postfix

그 다음 위와 같은 명령어를 입력하여 postfix를 설치해 줍니다.

최초 설치시에 위와 같은 화면을 보게 되는데, System mail name:을 입력하는 곳에 메일을 보낼 도메인(저는 당연히 mast3r.com이겠죠?)를 입력해 줍니다.

dpkg-reconfigure postfix

설치가 완료된 이후에 위의 명령어로 postfix에 대한 설정을 다시 구성하도록 합시다.

dpkg-reconfigure postfix명령어를 입력 하게되면 3번째 옵션부터 설정해야합니다.

제일먼저 시스템관리자의 계정을 입력하는 옵션입니다.

저는 pi계정으로 시스템을 관리하기 때문에 pi를 입력하였습니다.

다음으로는 도착지 설정입니다. postfix가 최종 목적지로 사용할 도메인명을 적어주시면 됩니다.

저는 mast3r.com과 mail.mast3r.com을 최종 목적지로 추가 하였습니다.

나머지 위의 옵션 부분에서는 똑같이 따라하시면 됩니다.

postconf -e 'home_mailbox = Maildir/'

위의 명령어는 기본 홈 메일박스를 Maildir/로 설정하는 명령어입니다.

(기본적으로 mbox와 Maildir방식이 있는데 Maildir로 설정합니다. 간단하게 설명하면 사용자마다 다른 폴더를 생성한다)

이후 SMTP에서 SASL을 사용하기 위한 설정들입니다

(SASL은 Simple Authentication and Security Layer의 약자로 SMTP를 사용할 때 인증사용을 위한 설정이라고 간단하게 알아두면 될듯합니다.[틀리면 알려주세요!!])

다음은 master.cf에서의 주석해제입니다. 붉은 네모에 있는 줄들의 주석을 해제해줍니다.

다음은 SSL인증을 위한 Letsenctpt설치입니다! apache2와 letsencrypt를 설치합니다.

apache2는 letsencrypt에서 인증서를 발급할 때 인증을 위하여 필요하기 때문에 같이 설치 합니다.

두 패키지가 설치 된 이후에 인증을 위해서 systemctl stop apache2로 아파치를 중지시켜줘야 합니다

certbot certonly --agree-tos -email [email] -d [mail.[domail]]

위 명령어를 입력하고 나오는 옵션의 2번째 옵션을 선택하여 인증서를 발급받습니다.

성공적으로 발급받게 되면 위와같이 Congratultations!이라는 메세지가 나오게 됩니다.

다음은 인증서 자동 갱신 방법입니다.

crontab -e 

위 명령어로 root에 대한 crontab을 변경해주도록 합시다.

crontab의 맨 아래로 가서 위와같이 해당 줄을 추가해주도록 합시다.

간단하게 설명 하자면 매월 1일 01시 00분에 apache2를 종료시키고 03분에 인증서를 갱신시킨다라는 명령어 2줄입니다.

위는 생성된 인증서를 이용해서 SMTP를 설정하는 명령어들입니다.

모든 설정이 완료되었으면 systemctl restart postfix라는 명령어를 입력하여 postfix를 재시작하도록 합니다.

안녕하세요 여러분~ 이번에는 라즈베리파이와 도메인을 이용해서 나만의 메일버서를 구축해보려고 합니다.

 

구축전에 준비물은, 라즈베리파이,자신이 등록한 도메인,DDNS와 포트포워딩을 지원하는 공유기,입니다.

(저는 RPI3에 Raspbian, 도메인은 mast3r.com, 공유기는 IPtime A3004NS로 진행합니다)

생각보다 준비물이 많네요...;;;

 

포스팅은 총 4단계로 나누어서 진행하구요, 이 글애는 메일서버구축을 위한 사전준비를 포스팅 하려고 합니다.

최대한 쉽게 따라오실 수 있게 노력했으니 도움이 됐으면 좋겠습니다.!

 

자 이제, 시작해보겠습니다.

공유기에 라즈베리파이를 물리고 전원을 켜줍니다.

켜준 뒤 첫번째로 세팅할 곳은 공유기입니다.

제일 처음 공유기에 로그인을 해주시고(보통 192.168.0.1로 접속하시면 됩니다)

고급설정 -> 네트워크 관리 -> 내부 네트워크 설정에 들어갑니다.

들어가시면 현재 라즈베리파이가 잘 연결되어 있으며 할당되어 있는 IP는 192.168.0.6인걸 확인 할 수 있습니다.

 

다음으로는 포트포워딩 설정입니다.

고급 설정 -> NAT/라우터 관리 -> 포트포워드 설정에 들어갑니다.

안에 들어가시면 위 사진과같이 설정이 되어있어야 합니다.

설정 하는 방법은 간단한데 밑에 보이는 규칙이름에 임의의 이름을 넣고 내부 IP주소,

곧 아까 확인한 192.168.0.6를 입력하면 됩니다.

그리고 외부포트와 내부포트는 각각 사진의 있는 값을 따라서 적으시면 됩니다.

 

2번의 ssh2룰은 외부에서 내부로 도메인을 사용해 ssh로 접속할때 쓰기위한 룰입니다

3번룰은 2단계에서 Letsencrypt를 사용해서 인증서를 만들때 웹서버 인증이 필요하기 때문에 필요한 룰입니다.

4,5번룰은 SMTP에서 사용하는 포트를 포워딩 해주는 룰입니다.

6~9번까지의 룰은 IMAP/POP3에서 사용하는 포트들을 포워딩 해주는 룰입니다.

 

포워딩을 마친 뒤에 고급 설정 -> 특수기능 -> DDNS설정이라고 써진 메뉴를 들어갑니다.

이 페이지 붉은색으로 네모쳐진 곳에 두가지 값을 입력해야하는데, 호스트 이름은 DDNS의 이름을 입력하는 칸이고

사용자 ID는 사용하시는 이메일 주소를 넣으시면 됩니다.

호스트이름에 넣으시는 이름이 곧 외부에서 내부로 접속할때 사용되는 DDNS이름이 됩니다!

2칸을 모두 채워주시고 생성버튼을 누르면 위 사진과 같이 DDNS가 등록되게 됩니다.

이렇게 따라와 주셨으면 공유기 설정은 모두 마쳤습니다!

 


이제 도메인을 세팅할 차례입니다.

저는 hosting.kr에서 도메인을 구입했습니다. 

hosting.kr의 서브도메인 설정화면은 위 사진과 같으며, 총 3개의 서브도메인이 보이지만... 

www도메인은 제 웹서버 도메인이므로..생략해도 됩니다 ㅋㅋ

 

최상위 도메인(아무것도 없는 도메인)에는 A레코드로 아까 만든 DDNS에 대한 IP,

(cmd에서 ping [ddns 주소]하면 실제 IP를 확인할 수 있습니다.) 

mail서브도메인에서는 CNAME으로 아까 생성했던 DDNS 주소를 입력하고 적용합니다.

여기까지 오셨으면 도메인 세팅도 끝났습니다!.


이제 라즈베리파이를 세팅할 차례입니다.

저는 putty를 사용하여 제 rpi에 접속하였습니다. 접속시 실제 도메인을 사용하여 로그인하였습니다. Host Name에는 도메인이름을 Port에는 아까 공유기에서 포트포워딩해준 포트 60001번을 넣고 Open을 눌러 접속합니다.

그리고 pi/raspberry로 로그인을 합니다. (이 계정과 비번은 기본 세팅이니 꼮 변경해주시기 바랍니다!!!!변경필쑤!!)

로그인을 한 뒤 아래 명령어를 입력 해 루트계정으로 작업을 실행합니다(매번 sudo를 치기 귀찮기 때문이죠...후훗)

sudo su

참고로 현재 상태에서는 root계정에 대해 비밀번호가 걸려있지 않기 때문에 반드시 비밀번호를 설정해주시기 바랍니다!!! 제발요.. 꼭 해주세요...

root계정으로 접근한 뒤, 아래의 명령어를 입력하여 시스템을 최신버전으로 업데이트 해줍니다.

apt update; apt upgrade -y

이 단계는 옵션입니다. 저는 개인적으로 VIM을 선호하기때문에 라즈베리파이에 설치해 줍니다.

apt install vim 

 

다음으로는 host이름을 변경합니다.

vim /etc/hostname
#이 명령어로 hostname 파일을 열고

dd
#raspberrypi 를 지워줍니다

i
#입력모드로 전환합니다. 

mast3r.com
#자신의 도메인주소를 적어줍니다

esc
#esc버튼을 눌러 입력모드를 나갑니다

:wq
#위 명령을 입력하여 저장 후 닫습니다.

다음은 /etc/hosts파일을 변경해야합니다.

 

위에서 했던 것 처럼 값을 변경/입력해줍니다. 변경할 값은 127.0.1.1 을 도메인 이름으로 변경하고 새 줄에는 DDNS대한 IP주소를 삽입 후 도메인을 입력하면 됩니다! (제 IP는 가렸습니다. 소중하니까요..ㅋㅋ어차피 ping때리면 나오는데.. 왜가렸을까)

어쨋든! 이렇게 하시면 기본설정은 끝났습니다.

이제 실제 이메일에 사용될 계정을 만들어보도록 하겠습니다.

 

이렇게 간단할 수가....

useradd linux
usermod -G mail linux
usermod -s /usr/sbin/nologin linux
passwd linux

이 4문장만 입력하시면 나중에 실제로 사용될 이메일 계정이 만들어지는 겁니다.

vim /etc/passwd
vim /etc/group

계정을 만든 뒤에 위의 파일을 열어서 실제로 계정이 추가됐는지 확인할 수 있습니다.

 마지막으로

chown :mail /home
chmod 775 /home

 /home의 그룹을 mail로 변경하고 775권한을 주는 이유는 postfix에서 Maildir형식으로 메일 디렉토리를 구성할 것이기 때문입니다.(즉 이메일 계정이 생성될 때 마다 /home/[user]/Maildir이 생성됩니다)

모든 명령을 마친 이후에 

reboot

리부팅을 해주면 모든 사전준비가 끝나게 됩니다.

따라오시느라 고생하셨습니다! 두번째 글에서는 Postfix설치 및 설정, letsencrypt를 이용한 SSL/TLS 설정을 포스팅 하도록하겠습니다.

이번에 풀어볼 문제는 bWAPP의 A1-Injection Section의 제일 첫번째 문제인 HTML Injection -REflected(GET) 문제입니다!!

문제풀이를 위해 기본페이지에서 위 사진과 같이 로그인을 한다. (ID:bee PW:bug) 밑에 보이는 난이도는 기본으로 low로 설정되어 있으니 바꾸지 말고 로그인한다.

로그인 후에는 위와같이 어떤 취약점을 공략할지 리스트가 나오게 되는데, 제일 처음에 보이는 HTML Injection - REflected(GET)을 선택하고 밑의 HACK버튼을 클릭한다.

①에서 First name:에 hello, Last name:에 world를 입력하고 GO버튼을 누르면 아래에 Welcome hello world, 즉 사용자가 입력한 결과를 출력한다. ②를 확인해보면 사용자가 입력했던 값들이 URL로 넘어가는 것으로 GO를 누르면 HTTP GET방식으로 서버에 요청을 보낸다는 것을 확인 할 수 있다.

만약 GO 버튼이 사용자가 입력한 값을 모두 출력한다면, 입력칸에 HTML TAG를 사용한다면 어떻게 될까?

위 사진같이과 같이 현재 LOW레벨에서는 사용자 입력값에 대한 sanitizing이 적용되지 않아서 사용자가 입력한 값을 모두 그대로 출력하게 된다! 사용자 입력값이 완벽한 HTML TAG이기 때문에 출력되는 값은 HTML TAG가 적용된 TEXT가 나오게 된다!

우측 상단의 security level을 Medium으로 바꾸고 똑같이 LOW에서 했던 것 같이 HTML TAG를 입력해보면 이번에는 HTML TAG가 적용되지 않고 사용자 입력 String이 그대로 출력되게 된다.

왜 그런것일까...?

Medium 레벨에서는 입력 값에 대해서 HTML관련 Character가 있으면 해당 문자를 Escaping처리를 하는 함수가 있다는 것을 추측 할 수 있다.

예를들어 < 가 입력되면 sanitizing기능은 이 문자를 %3C로 변환 시킨다.

그렇다면 어떻게 해야 이 Sanitizing기능을 우회할 수 있을까?

에초에 Sanitizing에 걸리지 않는 문자들로 HTML TAG를 Encoding하게된다면? 예를들어 원래는 <를 입력해야하지만 %3C로 변환하여 입력한다면? %3C는 HTML Character가 포함되어있지 않기 때문에 escaping 되지 않은 채로 출력 되게 된다.

 위 사진은 Fiddler라는 툴을 이용하여 <h1>hello</h1>를 Encoding 한 사진이다. 위의 결과 값을 복사하여 First name칸에 복사를 하게되면 아래 사진과 같이 sanitizing을 우회하여 HTML TAG를 적용 시켰음을 확인할 수 있다.

 

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

해석

13195의 소수인 약수는 5, 7, 13과 29 이다

600851475143의 가장 큰 소수인 약수는 무엇인가

 

 

코드는 다음과 같다

public static void main(String[] args){
		long target = 600851475143L;
		long ans = find_P(target);
		System.out.println(ans);
	}
	
static int find_P(long target){
	long buf = target; 
	int ans=2;
	
	while(buf > ans){
	    if(buf % ans == 0){
	        buf = buf/ans;
	    }
	    else{
	        ans++;
	    }
	}
	return ans;
}

 

이 문제를 푸는데 핵심은 BruteForce 방법을 이용하지 않고 문제를 풀 수 있느냐를 물어보는 것 같다

(혹시나 BruteForce를 사용한다고 해도 설마 loop의 range를 주어진 수 전체로 두지는 않겠지...?

소수인 약수는 는 주어진 수의 0.5배를 넘을 수 없다! 

예를 들어 주어진 수가 10이라 하면 5이상의 소수는 절대 10의 약수가 될 수 없다는 것을 바로 알것이다)

 

1~5번째 줄은 main method를 돌리는 거라 크게 볼건 없고

 

7~20번째 줄까지 살펴 보면 된다 

 

8번째 줄에서 'target' parameter를 buf 로 복사하는 이유는 Call by value 형식으로 변수가 넘어오기 떄문이기도 하고

주어진 수를 소수인 약수로 계속하여 갱신하기 때문이다

 

9번째 줄의 'ans' 변수는 소수를 저장하는 변수이다 

 

11번째 줄에서는 buf가 ans보다 클 경우 안의 코드를 실행하는데,

ans는 계속 늘어나는 소수이고, buf는 ans로 나눠지지 않을 때까지 나눠지는 수이기 때문에

마지막에 최종 제일 큰 소수가 ans에 할당되면 while문을 탈출하게 된다. 

 

12번째줄의 if 문에서 만약 ans로 buf를 나눌수 있으면 buf를 나눈다

그렇지 않으면 15번째 줄 else문에서 ans를 증가시킨다

 

여기서 포인트는 어떠한 수이던 간에 소수인 약수는 단 한번밖에 나오지 않기 때문에 이런식으로 값을 구할 수 있다. 

예를들어 81이라는 숫자는 3의 4승인데, 3이 4번 곱해져서 그렇지 소수인 약수는 3밖에 없다,

 

위 코드는 일종의 제일 큰 수를 저장하는 기능이 있는 소인수 분해코드라고 보면 된다. 

'Programming > ProjectEuler' 카테고리의 다른 글

ProjectEuler 2  (0) 2021.01.04
ProjectEuler 1  (0) 2021.01.04

2번문제

Each new term in the Fibonacci sequence is generated by adding the previous two terms. 
By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

By considering the terms in the Fibonacci sequence whose values do not exceed four million, 
find the sum of the even-valued terms.

해석 : 

피보나치 수열의 다음 수열은 이전의 두 수열을 더한 합과 같다

1과 2로 시작하여 처음 10번째까지의 수열은 다음과 같다:

 

1, 2, 3, 5, 8, 13, 21, 34, 55, 89

 

4백만이 넘지 않는 피보나치 수열이 있다고 가정할때 

짝수인 피보나치의 수열을 합을 구하여라

 

코드는 아래와 같다 

     public static void main(String []args){
        int sum = 0;
		int f1 = 1;
		int f2 = 1;
		while(f1<4000000){
			f1 = f1 + f2;
			f2 = f1 - f2;
			if(f1%2==0){
				sum=sum+f1;
			}
		}
		System.out.print(sum);
     }

문제가 물어보는 것은 피보나치 수열을 짤 수 있느냐를 물어보는 것 같다. 

 

int buf =0;
int f1 = 1;
int f2 = 1;
	while(true){
		buf = f2;
		f2 = f1+f2;
		f1 = buf;
	}

 

1번째 줄은 임시 변수

2번째 줄의 f1은 피보나치 첫번째 수열인 1
3번째 줄의 f2는 피보나치 두번째 수열인 1이고

 

나머지는 일반적으로 간단하게 생각할 수 있는 변수를 3개를 사용하여 계속해서 피보나치 수열을 만들어가는 방법이다

(코드는 돌리지 마시길.. 무한 루프임ㅋㅋ)

 

하지만 조금 생각해보면 만들어질 새운 피보나치 수열은 현재 변수 2개로 만든다!

 

int f1 = 1;
int f2 = 1;
	while(true){
		f1 = f1 + f2;
		f2 = f1 - f2;
	}

위 코드를 잘 보면

 

4번째 줄에서 하는 작업은 피보나치의 다음 수열을 현재 두개의 변수로 생성한다

 

이게 핵심인데 피보나치 수열을 이항하면 F[n-1] = F[n] - F[n-2]와 같은 식이 나오는데

피보나치의 다음수열에서 이전전 수열을 빼면 이전 수열이 나온다는 소리이다. 

 

4번째줄에서 f1변수는 F[n]을 저장하였고 f2변수는 F[n-2]를 저장하고 있기 때문에 둘이 빼면 F[n-1]을 얻을 수 있다!!!

 

말로 설명하니까 햇갈릴수도 있는데, 직접 수를 대입해서 몇번만 해보면 이해갈것이다. 

 

 

문제 조건이 짝수인 피보나치인 수를 더하는 것이기 때문에 mod operation으로

홀수를 걸러주면서 더해주면 답이 나온다!

'Programming > ProjectEuler' 카테고리의 다른 글

ProjectEuler 3  (2) 2021.01.05
ProjectEuler 1  (0) 2021.01.04

이번 포스팅에서는 golang의 Hello world에 관해서 알아보겠습니다

 

package main // 1. Package Definition

import "fmt" // 2. Package import

func main() {// 3. Method definition
    fmt.Println("Hello, World.")
}

1. Package definition

  • 해당 소스파일이 속하는 package를 나타냅니다
    • main package는 독립적으로 실행할 프로그램으로 작성 시 package명을 main으로 설정합니다

2. Package import

  • fmt 라는 데이터의 I/O를 위한 함수들이 들어있는 패키지를 import 합니다
    • fmt package를 제외하고 표준 라이브러리에는 100개 이상의 패키지가 존재한다고 합니다
  • 패키지 사용시 문법은 import "[package name]" 으로 적습니다. 꺽쇠, 중괄호, 대괄호 다 필요 없구요! 따옴표 사이에 이름만 적어주시면 됩니다. (이 부분은 C에서 넘어오신 분이면 헷갈리실 것 같습니다 보통 import 하실 때 표준라이브러리가 아닌 파일을 import 할때 사용하는 방식이고 표준라이브러리를 import할 경우 꺽쇠를 사용하니까요 ㅎㅎ)

3. Method definition

  • 함수 선언에는 func 키워드를 붙여 함수를 선언 및 정의합니다. 
  • 여기서는 main package 에서 main함수를 선언 및 정의하여 독립적으로 구동가능하게끔 코딩되었습니다
  • 내용은 fmt package의 내부 method인 Println을 사용해 Hello, world. 를 출력하는 것 입니다. 

 

helloworld에서 문법 및 주의사항!

문장이 한줄에 두개이상 나오는 경우 외에는 문장끝에 세미콜론을 붙이지 않습니다.

func main() {
	
    // 두 문장이 한 줄에 있기 때문에 구분하기 위해 세미콜론을 붙였습니다. 
    // 두 번째 문장은 뒤에 더이상 내용이 없기 때문에 세미콜론을 붙히지 않습니다. 
    fmt.Println("Hello, 세계"); fmt.Println("Hello, World")
}

 

함수 여는 중괄호가 func 키워드와 같은 줄에 있지 않으면 Syntax Error 발생

// Syntax Error 발생! 중괄호( { ) 는 반드시 func키워드가 오는 줄에 위치해야 합니다 
func main() 
{
    fmt.Println("Hello, 세계")
}

// 옳은 예제
func main(){
   fmt.Println("Hello, 세계")
}

 

실행!

위의 hello world 예제 소스를 helloworld.go 파일로 저장해 준 뒤 , 해당 파일이 있는 곳에서 아래와 같은 명령어로 컴파일 해줍니다. 

 

go build helloworld.go

 

컴파일이 완료 되게 되면, 리눅스는 helloworld, 윈도우는 helloworld.exe라는 바이너리가 생성됩니다.

 

해당 바이너리 혹은 실행파일을 실행하게 되면 helloworld가 출력됩니다! 

 

helloworld 빌드 및 실행

 

 

 

'Programming > golang' 카테고리의 다른 글

golang이란?  (0) 2021.01.03

+ Recent posts