<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SpaLinux.com &#187; Linux Shell</title>
	<atom:link href="http://spalinux.com/category/linux-shell/feed" rel="self" type="application/rss+xml" />
	<link>http://spalinux.com</link>
	<description>Resources for Relaxing Linux System Administrators</description>
	<lastBuildDate>Sat, 21 Jan 2012 16:07:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>จำกัดจำนวน login พร้อมกันของผู้ใช้เดียวกัน</title>
		<link>http://spalinux.com/2011/05/limit_maximum_number_of_logins_for_user</link>
		<comments>http://spalinux.com/2011/05/limit_maximum_number_of_logins_for_user#comments</comments>
		<pubDate>Sun, 08 May 2011 07:13:52 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Authentication]]></category>
		<category><![CDATA[Linux Shell]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[limit]]></category>
		<category><![CDATA[login]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1325</guid>
		<description><![CDATA[การจำกัด (limit) จำนวนการ login พร้อมกันโดยใช้ชื่อผู้ใช้เดียวกัน สามารถคอนฟิกด้วยออปชั่น &#8220;maxlogins&#8221; ในไฟล์ /etc/security/limits.conf คำอธิบายออปชั่น &#8220;maxlogins&#8221; คือ max number of logins for this user คอนฟิกได้สองแบบคือ จำกัดเป็นรายคน เช่น ชื่อผู้ใช้ user1 สามารถ login ได้สูงสุดพร้อมกันได้แค่ 2 sessions แต่ถ้าต้องการจำกัดผู้ใช้ที่อยู่ในกลุ่ม (group) ให้เติมเครื่องหมาย @ ข้างหน้าชื่อกลุ่ม ตัวอย่างคอนฟิก จำกัดผู้ใช้ user1 ให้ login พร้อมกันได้แค่ 2 sessions เท่านั้น [root@server ~]# cat /etc/security/limits.conf user1           -       maxlogins       2 หลังแก้ไขไฟล์แล้ว คอนฟิกใหม่มีผลต่อการ login ครั้งต่อไปเลย [...]]]></description>
			<content:encoded><![CDATA[<p>การจำกัด (limit) จำนวนการ login พร้อมกันโดยใช้ชื่อผู้ใช้เดียวกัน สามารถคอนฟิกด้วยออปชั่น &#8220;maxlogins&#8221; ในไฟล์ /etc/security/limits.conf</p>
<p>คำอธิบายออปชั่น &#8220;maxlogins&#8221; คือ max number of logins for this user</p>
<p><span id="more-1325"></span></p>
<p>คอนฟิกได้สองแบบคือ จำกัดเป็นรายคน เช่น ชื่อผู้ใช้ user1 สามารถ login ได้สูงสุดพร้อมกันได้แค่ 2 sessions แต่ถ้าต้องการจำกัดผู้ใช้ที่อยู่ในกลุ่ม (group) ให้เติมเครื่องหมาย @ ข้างหน้าชื่อกลุ่ม</p>
<p>ตัวอย่างคอนฟิก จำกัดผู้ใช้ user1 ให้ login พร้อมกันได้แค่ 2 sessions เท่านั้น</p>
<pre>[root@server ~]# <strong>cat /etc/security/limits.conf
</strong>user1           -       maxlogins       2</pre>
<p>หลังแก้ไขไฟล์แล้ว คอนฟิกใหม่มีผลต่อการ login ครั้งต่อไปเลย ไม่จำเป็นต้องรีสตาร์ตโปรแกรม หรือเซอร์วิสใด</p>
<p>ตัวอย่างข้อความในไฟล์ /var/log/secure ที่เกิดขึ้น ระหว่างการทดสอบ login</p>
<p>login ด้วย user1 ครั้งแรก ได้</p>
<pre>Jul  8 13:21:19 server sshd[2375]: Accepted password for user1 from 192.168.1.12 port 4310 ssh2
Jul  8 13:21:19 server sshd[2375]: pam_unix(sshd:session): session opened for user user1 by (uid=0)</pre>
<p>login ด้วย user1 ครั้งที่ 2 ก็ได้</p>
<pre>Jul  8 13:21:39 server sshd[2400]: Accepted password for user1 from 192.168.1.12 port 4311 ssh2
Jul  8 13:21:39 server sshd[2400]: pam_unix(sshd:session): session opened for user user1 by (uid=0)</pre>
<p>ใช้คำสั่ง w เพื่อดูผู้ใช้ที่ login อยู่</p>
<pre>[user1@server ~]$ <strong>w</strong>
 13:21:49 up 14 min,  3 users,  load average: 0.07, 0.19, 0.25
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
admin    pts/0    192.168.1.12         13:19   35.00s  0.72s  0.18s sshd: admin [priv]
user1    pts/1    192.168.1.12         13:21   30.00s  0.20s  0.20s -bash
user1    pts/2    192.168.1.12         13:21    0.00s  0.25s  0.04s w</pre>
<p>login ด้วย user1 ครั้งที่ 3 จะไม่ได้แล้ว</p>
<pre>Jul  8 13:22:00 server sshd[2426]: Accepted password for user1 from 192.168.1.12 port 4312 ssh2
Jul  8 13:22:00 server sshd[2426]: <span style="color: #ff0000;"><strong>pam_limits(sshd:session): Too many logins (max 2) for user1
</strong></span>Jul  8 13:22:00 server sshd[2426]: pam_unix(sshd:session): session opened for user user1 by (uid=0)
Jul  8 13:22:00 server sshd[2426]: error: PAM: pam_open_session(): Permission denied</pre>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2011/05/limit_maximum_number_of_logins_for_user/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>รันโปรเซสเป็น user อื่น</title>
		<link>http://spalinux.com/2010/03/run_process_as_another_user</link>
		<comments>http://spalinux.com/2010/03/run_process_as_another_user#comments</comments>
		<pubDate>Sat, 06 Mar 2010 05:52:51 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Authentication]]></category>
		<category><![CDATA[Linux Shell]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[Users]]></category>
		<category><![CDATA[Utility]]></category>
		<category><![CDATA[unix process]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1088</guid>
		<description><![CDATA[เป็นวิธีง่ายๆ เพื่อให้ผู้ใช้ root สามารถรันโปรเซสหรือโปรแกรมบน Linux/UNIX ภายใต้สิทธิหรือ permission ผู้ใช้ user อื่นบนเครื่องเดียวกัน คำสั่งที่ใช้คือ su ตามด้วยออปชั่น &#8216;-c&#8217; รูปแบบการใช้คำสั่งคือ # su - &#60;user_name&#62; -c "&#60;command&#62;" ตัวอย่าง root รันคำสั่ง id ภายใต้สิทธิผู้ใช้ชื่อ user1 # su - user1 -c "id" uid=501(user1) gid=100(users) groups=100(users) ข้อมูลอ้างอิง &#8216;su&#8217; man page]]></description>
			<content:encoded><![CDATA[<p>เป็นวิธีง่ายๆ เพื่อให้ผู้ใช้ root สามารถรันโปรเซสหรือโปรแกรมบน Linux/UNIX ภายใต้สิทธิหรือ permission ผู้ใช้ user อื่นบนเครื่องเดียวกัน</p>
<p><span id="more-1088"></span>คำสั่งที่ใช้คือ su ตามด้วยออปชั่น &#8216;-c&#8217; รูปแบบการใช้คำสั่งคือ</p>
<pre># su - &lt;user_name&gt; -c "&lt;command&gt;"</pre>
<p>ตัวอย่าง root รันคำสั่ง id ภายใต้สิทธิผู้ใช้ชื่อ user1</p>
<pre># <strong>su - user1 -c "id"
</strong>uid=501(user1) gid=100(users) groups=100(users)</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li>&#8216;su&#8217; man page</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/03/run_process_as_another_user/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSH &#8211; Secure Shell ล็อกอินด้วย Public Key Authentication</title>
		<link>http://spalinux.com/2008/10/ssh_secure_shell_login_using_public_key_authentication</link>
		<comments>http://spalinux.com/2008/10/ssh_secure_shell_login_using_public_key_authentication#comments</comments>
		<pubDate>Thu, 09 Oct 2008 18:30:13 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Linux Shell]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[Utility]]></category>
		<category><![CDATA[public key authentication]]></category>
		<category><![CDATA[secure shell]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=235</guid>
		<description><![CDATA[จากที่ได้ แนะนำการใช้งานโปรแกรม Secure Shell (SSH) เพื่อล็อกอินไปยังเครื่องอื่นนั้น โดยดีฟอลต์แล้วจะต้องใส่รหัสผ่าน (password) ก่อนที่จะล็อกเข้าไปยังเครื่องปลายทางได้ หรือรันคำสั่งบนเครื่องปลายทางได้ แต่ในบางครั้งการที่ต้องใส่รหัสผ่านทุกครั้งทำให้ไม่สะดวกในการใช้งาน ตัวอย่างเช่นต้องล็อกอินไปยังหลายๆ เครื่องอยู่เป็นประจำ หรือการเขียน Shell Script เพื่อล็อกอินไปยังเครื่องต่างๆ เพื่อรันคำสั่งที่ต้องการ   ในที่นี้จะแนะนำการล๊อกอินไปยังเครื่องปลายทางโดยไม่ต้องใส่รหัสผ่าน แต่อาศัยการล็อกด้วย Public Key Authentication การตรวจสอบสิทธิในการล็อกอินโดยใช้ Public Key Authentication ในตัวอย่างของบทความนี้จะคอนฟิกในระดับ user คือจะคอนฟิก user1 บนเครื่องไคลเอนต์ (Client) เพื่อจะล็อกอินไปเป็น user2 บนเซิร์ฟเวอร์ (Server) โดยไม่ต้องใส่รหัสผ่าน ขั้นตอนที่ต้องทำมีดังนี้ หมายเหตุ ตัวอย่างในบทความนี่ทดสอบบน Fedora 9 ซึ่งคอนฟิกดีฟอลต์จะอนุญาตให้สามารถล็อกอินแบบ Public Key Authentication ได้ หากคุณใช้ลีนุกซ์เวอร์ชั่นอื่นๆ ถ้าทำตามแล้วไม่ได้ ลองตรวจสอบไฟล์คอนฟิกของ ssh server ซึ่งอยู่ในไฟล์ /etc/ssh/sshd_config [...]]]></description>
			<content:encoded><![CDATA[<p>จากที่ได้ <a href="http://spalinux.com/2008/10/introduction_to_secure_shell_ssh" target="_self">แนะนำการใช้งานโปรแกรม Secure Shell (SSH)</a> เพื่อล็อกอินไปยังเครื่องอื่นนั้น โดยดีฟอลต์แล้วจะต้องใส่รหัสผ่าน (password) ก่อนที่จะล็อกเข้าไปยังเครื่องปลายทางได้ หรือรันคำสั่งบนเครื่องปลายทางได้</p>
<p>แต่ในบางครั้งการที่ต้องใส่รหัสผ่านทุกครั้งทำให้ไม่สะดวกในการใช้งาน ตัวอย่างเช่นต้องล็อกอินไปยังหลายๆ เครื่องอยู่เป็นประจำ หรือการเขียน Shell Script เพื่อล็อกอินไปยังเครื่องต่างๆ เพื่อรันคำสั่งที่ต้องการ   ในที่นี้จะแนะนำการล๊อกอินไปยังเครื่องปลายทางโดยไม่ต้องใส่รหัสผ่าน แต่อาศัยการล็อกด้วย Public Key Authentication</p>
<p><span id="more-235"></span></p>
<p>การตรวจสอบสิทธิในการล็อกอินโดยใช้ Public Key Authentication ในตัวอย่างของบทความนี้จะคอนฟิกในระดับ user คือจะคอนฟิก user1 บนเครื่องไคลเอนต์ (Client) เพื่อจะล็อกอินไปเป็น user2 บนเซิร์ฟเวอร์ (Server) โดยไม่ต้องใส่รหัสผ่าน ขั้นตอนที่ต้องทำมีดังนี้</p>
<p>หมายเหตุ ตัวอย่างในบทความนี่ทดสอบบน Fedora 9 ซึ่งคอนฟิกดีฟอลต์จะอนุญาตให้สามารถล็อกอินแบบ Public Key Authentication ได้ หากคุณใช้ลีนุกซ์เวอร์ชั่นอื่นๆ ถ้าทำตามแล้วไม่ได้ ลองตรวจสอบไฟล์คอนฟิกของ ssh server ซึ่งอยู่ในไฟล์ /etc/ssh/sshd_config โดยคอนฟิกที่ต้องเปิดไว้คือ PubkeyAuthentication และ AuthorizedKeysFile</p>
<h4>สร้าง Public/Private Key ของ user1 บนเครื่องไคลเอนต์</h4>
<p>ล๊อกอินเป็น user1 บนเครื่องไคลเอนต์แล้วใช้คำสั่ง ssh-keygen เพื่อสร้าง Public/Private Key</p>
<p>ตัวอย่างการใช้คำสั่ง ssh-keygen</p>
<pre>[user1@client ~]$ <strong>ssh-keygen
</strong>Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa.
Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
fd:5c:11.......... user1@client</pre>
<p>สองไฟล์ที่ถูกสร้างจากการรันคำสั่ง ssh-keygen จะถูกเก็บไว้ในไดเร็คทอรี .ssh/ โดยจะมีไฟล์</p>
<ul>
<li><strong>id_rsa</strong> เป็นไฟล์ที่เก็บ Private Key ซี่งเป็นคีย์ที่เป็นความลับไม่แนะนำให้เปิดเผยไฟล์นี้ให้คนอื่นเห็น สังเกตได้จากสิทธิของไฟล์ (permission) จะเป็น 600</li>
<li><strong>id_rsa.pub</strong> เป็นไฟล์ที่เก็บ Public Key ซึ่งเป็นคีย์ที่สามารถเปิดเผยให้คนอื่นเห็นได้ แล้วใช้ในการเข้ารหัสข้อมูลเพื่อยืนยันว่าเป็นตัวเราจริงๆ โดยเราจะ copy ไฟล์นี้ไปยัง user2 บนเครื่องปลายทาง</li>
</ul>
<h4>ไฟล์ authorized_keys ของ user2 บนเครื่องเซิร์ฟเวอร์</h4>
<p>ขั้นตอนต่อไปคือ copy ไฟล์ Public Key ของ user1 จากเครื่องไคลเอนต์  ไปเก็บไว้ในไฟล์ authorized_keys ของ user2 บนเครื่องเซิร์ฟเวอร์ ซึ่งจะเป็นไฟล์ที่เก็บ Public Key ของ user ต่างๆ ที่มีสิทธิล๊อกอินมาเป็น user นี้โดยไม่ต้องใส่รหัส </p>
<p>วิธีการ copy ไฟล์  Public Key จากไคลเอนต์ไปยังเซิร์ฟเวอร์ สามารถทำได้โดยใช้คำสั่ง scp บนเครื่องไคลเอนต์</p>
<p>ตัวอย่างการ copy ไฟล์ จากเครื่องไคลเอนต์ไปยังเซิร์ฟเวอร์โดยใช้คำสั่ง scp</p>
<pre>[user1@client ~]$ <strong>scp .ssh/id_rsa.pub user2@server:
</strong>user2@server's password:
id_rsa.pub                              100%  394     0.4KB/s   00:00</pre>
<p>หมายเหตุ อย่าลืมเครื่องหมาย :  (colon) หลังคำว่า server เพื่อระบุว่าเป็นการ copy ระหว่างเครื่อง</p>
<p>ขั้นต่อไปล๊อกอินเป็น user2 บนเครื่องเซิร์ฟเวอร์ แล้วใช้คำสั่ง ls ดู จะเห็นไฟล์ที่ถูก copy มา ให้ใช้คำสั่ง cat เพื่อนำคีย์ในไฟล์นี้ไปต่อท้ายไฟล์ authorized_keys ของ user2</p>
<p>หมายเหตุ ต้องสร้างไดเร็คทอรี .ssh/ ของ user2 ไว้ก่อนที่จะสร้างหรือเพิ่มเติมไฟล์ authorized_keys ตามตัวอย่างด้านล้างนี้ได้</p>
<p><span style="color: #ff0000;">คำเตือน ระมัดระวังการใช้คำสั่ง cat เพื่อนำข้อมูลไปต่อท้ายไฟล์ต้องใช้เครื่องหมายมากกว่าสองอันติดกัน <strong>&gt;&gt;</strong>  </span></p>
<p>ตัวอย่างการสร้างไดเร็คทอรี .ssh/ และการเพิ่ม authorized_keys บนเซิร์ฟเวอร์</p>
<pre>[user2@server ~]$ <strong>ls -l
</strong>total 4
-rw-r--r-- 1 user2 users 394 2008-10-10 15:09 id_rsa.pub</pre>
<pre>[user2@server ~]$ <strong>mkdir .ssh</strong>
[user2@server ~]$ <strong>chmod 700 .ssh</strong>/</pre>
<pre>[user2@server ~]$ <strong>cat id_rsa.pub &gt;&gt; .ssh/authorized_keys</strong></pre>
<h4>ทดลองล็อกอินโดยใช้ Public Key Authentication</h4>
<p>ทดลองใช้ user1 บนเครื่องไคลเอนต์ไปยัง user2 บนเครื่องเซิร์ฟเวอร์ โดยรูปแบบการใช้งานยังเหมือนเดิมไม่เปลี่ยนแปลง จะเห็นว่าไม่ต้องใส่รหัสผ่าน (password) อีกต่อไปแล้ว</p>
<pre>[user1@client ~]$ <strong>ssh user2@server</strong>
[user2@server ~]$</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li>man sshd_config(5)</li>
<li><a href="http://spalinux.com/2008/10/introduction_to_secure_shell_ssh" target="_self">แนะนำการใช้งานโปรแกรม Secure Shell (SSH)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2008/10/ssh_secure_shell_login_using_public_key_authentication/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>แนะนำการใช้งานโปรแกรม Secure Shell (SSH)</title>
		<link>http://spalinux.com/2008/10/introduction_to_secure_shell_ssh</link>
		<comments>http://spalinux.com/2008/10/introduction_to_secure_shell_ssh#comments</comments>
		<pubDate>Fri, 03 Oct 2008 18:38:38 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Linux Shell]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[Utility]]></category>
		<category><![CDATA[secure shell]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=230</guid>
		<description><![CDATA[SSH  (Secure Sell) คือโปรแกรมสำหรับล็อกอินและรันคำสั่งที่เครื่องปลายทางได้ โดยไม่จำเป็นต้องไปใช้งานที่หน้าจอคอนโซลของเครื่อง จุดประสงค์หลักของโปรแกรมคือทำหน้าที่แทนโปรแกรมประเภท rlogin, rsh หรือ telnet โดยจะมีการเข้ารหัสข้อมูล (encrypted) เพื่อความปลอดภัยของข้อมูลที่ส่งระหว่าง SSH Client และ SSH Server ชุดโปรแกรมที่ติดตั้งมากับลีนุกซ์ส่วนใหญ่คือ OpenSSH ประกอบด้วยเซิร์ฟเวอร์และไคลเอนต์ เครื่องปลายทางรันเซอร์วิส SSH Server เพื่อรองรับการล็อกอิน จากโปรแกรมประเภท SSH Client โดยคอนฟิกไฟล์หลักของเซิร์ฟเวอร์จะอยู่ในไดเร็กทอรี /etc/ssh/ ไฟล์คอนฟิกหลักคือไฟล์ /etc/ssh/sshd_config คำแนะนำ โปรแกรม PuTTY เป็นโปรแกรมประเภท SSH Client ที่สามารถรันได้บน Microsoft Windows ด้วยคุณสมบัติมากมาย รองรับทั้ง Secure Shell, Telnet และสามารถทำหน้าที่เป็น Terminal ผ่านทาง Serial หรือ COM Port ได้ด้วย (เช่นเดียวกับ [...]]]></description>
			<content:encoded><![CDATA[<p>SSH  (Secure Sell) คือโปรแกรมสำหรับล็อกอินและรันคำสั่งที่เครื่องปลายทางได้ โดยไม่จำเป็นต้องไปใช้งานที่หน้าจอคอนโซลของเครื่อง จุดประสงค์หลักของโปรแกรมคือทำหน้าที่แทนโปรแกรมประเภท rlogin, rsh หรือ telnet โดยจะมีการเข้ารหัสข้อมูล (encrypted) เพื่อความปลอดภัยของข้อมูลที่ส่งระหว่าง SSH Client และ SSH Server</p>
<p><span id="more-230"></span></p>
<p>ชุดโปรแกรมที่ติดตั้งมากับลีนุกซ์ส่วนใหญ่คือ OpenSSH ประกอบด้วยเซิร์ฟเวอร์และไคลเอนต์</p>
<p>เครื่องปลายทางรันเซอร์วิส SSH Server เพื่อรองรับการล็อกอิน จากโปรแกรมประเภท SSH Client โดยคอนฟิกไฟล์หลักของเซิร์ฟเวอร์จะอยู่ในไดเร็กทอรี /etc/ssh/ ไฟล์คอนฟิกหลักคือไฟล์ /etc/ssh/sshd_config</p>
<p><strong>คำแนะนำ</strong> โปรแกรม <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/" target="_blank">PuTTY</a> เป็นโปรแกรมประเภท SSH Client ที่สามารถรันได้บน Microsoft Windows ด้วยคุณสมบัติมากมาย รองรับทั้ง Secure Shell, Telnet และสามารถทำหน้าที่เป็น Terminal ผ่านทาง Serial หรือ COM Port ได้ด้วย (เช่นเดียวกับ HyperTerminal) และที่สำคัญสามารถงานใช้ได้ฟรีอย่างถูกต้อง (free software)</p>
<p>ในบทความนี้จะแนะนำวิธีการใช้คำสั่ง Secure Shell บนลีนุกซ์เป็นหลัก โดยตัวอย่างทั้งหมดจะทดสอบบน Fedora 9</p>
<h4>เริ่มต้นใช้งาน SSH Client (begin_ssh_client)</h4>
<p>เริ่มต้นทดลองใช้คำสั่ง ssh เพื่อล็อกอินไปยังเครื่องรีโมต ด้วยการพิมพ์คำสั่ง ssh แล้วตามด้วย IP Address หรือ Hostname ของเครื่องรีโมตปลายทาง</p>
<p>ตัวอย่างการล็อกอินไปที่เครื่องรีโมตครั้งแรก</p>
<pre>[user1@client ~]$ <strong>ssh 192.168.0.1
</strong>The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established.
RSA key fingerprint is 5a:f2:9f:1b:8a:.....
Are you sure you want to continue connecting (yes/no)?<strong> yes
</strong>Warning: Permanently added '192.168.0.1' (RSA) to the list of known hosts.
user1@192.168.0.1's password:
Last login: Thu Oct  2 10:46:39 2008 from 192.168.0.15
[user1@server ~]$</pre>
<p>ถ้าเพิ่งเริ่มล็อกอินไปยังเครื่องรีโมตครั้งแรก จะมีข้อความเกี่ยวกับ RSA key ขึ้นมาถามว่า yes หรือ no การตอบ yes คือการยอมรับคีย์ (RSA key) จากเซิร์ฟเวอร์ปลายทางมา เพื่อใช้ในการเข้ารหัสระหว่างไคลเอนต์และเซิร์ฟเวอร์ ต้องตอบ yes อย่างเดียวเท่านั้นเพื่อยอมรับคีย์นี้ ถ้าตอบ no ไปก็ไม่สามารถล็อกไปยังเครื่องปลายทางได้</p>
<p>เมื่อตอบ yes ไป คีย์ที่ได้รับมา เครื่องไคลเอนต์จะเก็บคีย์นี้ไว้ในรายชื่อที่เรียกว่า ‘known hosts’ โดยจะบันทีกเป็นไฟล์อยู่ในไดเร็กทอรี $HOME/.ssh/ ($HOME คือ home directory ของผู้ที่ใช้คำสั่งบนเครื่องไคลเอนต์)</p>
<p>ตัวอย่างไฟล์ที่เก็บ known hosts</p>
<pre>[user1@client1 ~]$ cat .ssh/known_hosts
192.168.0.1 ssh-rsa AAAAB..........................</pre>
<p>ประการหนึ่งที่เก็บรายชื่อ known hosts ไว้ ด้วยเหตุผลทางด้านความปลอดภัย (Security) โดยคีย์ที่เก็บไว้ในไฟล์นี้สามารถใช้ในการเปรียบเทียบกับคีย์ที่ได้รีบมาใหม่จากเซิร์ฟเวอร์ ว่าตรงกันหรือไม่ เพื่อยืนยันในครั้งต่อที่ล็อกอินเข้าไปเครื่องเดิมนี้ว่า เป็นเครื่องที่ถูกต้อง ใช่ที่เราต้องการจริงๆ ไม่ใช่เครื่องอื่นๆ ที่ปลอมแปลง IP Address มาตรงกัน</p>
<p>ตัวอย่างการล็อกอินไปที่เครื่องที่ถูกปลอมแปลง IP Address โดยจะมีข้อความฟ้องว่าคีย์ที่ได้มาไม่ถูกต้อง</p>
<pre>[user1@client ~]$ <strong>ssh 192.168.0.1</strong>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
<span style="color: #ff0000;">Someone could be eavesdropping on you right now (man-in-the-middle attack)!
</span>It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
5a:f2:9f:...
Please contact your system administrator.
Add correct host key in /home/user1/.ssh/known_hosts to get rid of this message.
Offending key in /home/user1/.ssh/known_hosts:1
RSA host key for 192.168.0.1 has changed and you have requested strict checking.
Host key verification failed.</pre>
<p>วิธีการแก้ไขถ้าเจอข้อความแบบนี้ คือต้องตรวจสอบดูก่อนว่าเครื่องปลายทางที่เราจะล็อกเข้าไปนั้นเป็นเครื่องที่ถูกต้องจริงๆ โดยเปรียบเทียบคีย์ของ Secure Shell ซึ่งถูกเก็บไว้ในไฟล์ /etc/ssh/ssh_host_rsa_key.pub ซึ่งอาจมีการเปลี่ยนแปลงได้ ด้วยการติดตั้งลีนุกซ์ใหม่ หรือใช้คำสั่ง ssh-keygen ในการสร้างคีย์ใหม่</p>
<p>ถ้าดูแล้วเป็นเครื่องที่ถูกต้องจริงๆ วิธีการแก้ไขคือแก้ไฟล์ $HOME/.ssh/known_hosts โดยลบบรรทัดที่มี IP Address ของเครื่องปลายทางออกไป แล้วพิมพ์คำสั่ง ssh อีกครั้ง จะมีข้อความถาม yes หรือ no เหมือนครั้งแรก เพื่อเก็บคีย์ใหม่เข้าไปในไฟล์ known_hosts อีกครั้ง</p>
<p>คำเตือน แต่ถ้าตรวจสอบเครื่องปลายทางแล้วไม่ถูกต้อง อาจเป็นเครื่องของคนที่พยายามเจาะระบบด้วยการปลอมแปลง IP Address ก็เป็นได้เพื่อคอยดักเก็บรหัสของเรา เพราะฉะนั้นห้ามทำตามวิธีด้านบนเด็ดขาด ให้ปรึกษาคนดูแลระบบเพื่อแก้ไขโดยด่วน</p>
<h4>ระบุชื่อ user ที่ต้องการล็อกอิน (Specify user login)</h4>
<p>โดยดีฟอลต์เมื่อใช้คำสั่ง ssh บนไคลเอนต์ เพื่อล็อกไปยังเซิร์ฟเวอร์ โปรแกรม ssh จะพยายามล็อกอินด้วย username ของคนที่รันคำสั่ง เช่นผู้ใช้ที่ชื่อว่า user1 พิมพ์คำสั่ง ssh 192.168.0.1 จะเป็นการล็อกอินไปที่เครื่อง 192.168.0.1 ด้วยชื่อผู้ใช้ user1</p>
<p>ถ้าต้องการระบุเป็นชื่ออื่น สามารถใช้ออปชั่น ‘-l’ แล้วตามด้วยชื่อผู้ใช้ปลายทาง หรือพิมพ์ ในรูปแบบ <a href="mailto:user@hostname">user@hostname</a>  เช่น ต้องการล็อกอินไปยังปลายทางด้วยชื่อผู้ใช้ user2 สามารถทำได้สองวิธีแล้วแต่ถนัดดังนี้</p>
<p>วิธีแรก ใช้ออปชั่น ‘-l’ แล้วตามด้วยชื่อผู้ใช้ปลายทาง</p>
<pre>[user1@client ~]$ <strong>ssh -l user2 192.168.0.1
</strong>user1@192.168.0.1's password:</pre>
<pre>Last login: Thu Oct  2 11:22:24 2008 from 192.168.0.15
[user2@server ~]$</pre>
<p>วิธีที่สอง ใช้รูปแบบ user@hostname</p>
<pre>[user1@client ~]$ <strong>ssh user2@192.168.0.1
</strong>user1@192.168.0.1's password:</pre>
<pre>Last login: Thu Oct  2 11:23:13 2008 from 192.168.0.15
[user2@server ~]$</pre>
<h4>การรันคำสั่งบนเครื่องปลายทางด้วย SSH (Run remote command with SSH)</h4>
<p>ในบางครั้งเราต้องการเพียงแค่รันคำสั่งบนเครื่องปลายทาง เช่นต้องการตรวจสอบสถานะการทำงานของเครื่องปลายทางด้วยคำสั่ง uptime และ free แทนที่ต้องล็อกอินเข้าไปที่เครื่องปลายทางเลย สามารถใช้คำสั่ง ssh แล้วระบุคำสั่งที่ต้องการรันบนเครื่องรีโมตได้เลย โดยให้อยู่ในเครื่องหมาย single-quote ‘</p>
<p>ตัวอย่างการรันคำสั่งบนเครื่องปลายทางด้วย ssh</p>
<pre>[user1@client ~]$ <strong>ssh user2@192.168.0.1 'uptime; echo; free'
</strong>user1@192.168.0.1's password:
 16:01:39 up 2 days, 13:17,  4 users,  load average: 0.03, 0.02, 0.00</pre>
<pre>             total       used       free     shared    buffers     cached
Mem:        515064     235620     279444          0      48516     102124
-/+ buffers/cache:      84980     430084
Swap:       987956         52     987904</pre>
<p>ผลลัพธ์ที่ได้จะเหมือนกับการล็อกอินเข้าไปที่เครื่องปลายทางก่อน แล้วค่อยรันคำสั่งต่างๆ</p>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://www.openssh.com" target="_blank">OpenSSH</a></li>
<li><a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/" target="_blank">PuTTY: A Free Telnet/SSH Client</a></li>
</ul>
<p><a href="http://www.openssh" target="_blank"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2008/10/introduction_to_secure_shell_ssh/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>การแปลง Linux man page ให้เป็น HTML</title>
		<link>http://spalinux.com/2008/08/format_manual_page_to_html</link>
		<comments>http://spalinux.com/2008/08/format_manual_page_to_html#comments</comments>
		<pubDate>Sat, 23 Aug 2008 18:45:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux Shell]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=92</guid>
		<description><![CDATA[man page บางคำสั่งบน Linux/UNIX นั้น นอกจากจะอธิบายวิธีการใช้งานโปรแกรมแล้ว จะพูดถึงพื้นฐานของคำสั่งนั้นด้วยด้วย บางคำสั่งมีขนาดยาวมากๆ หลายหน้าจอ ซึ่งอาจไม่สะดวกอ่าน หรือทำให้เมื่อยล้าต่อการศึกษาทำความเข้าใจ โดยเฉพาะส่วนตัวผมเองนั้น ไม่ชอบการอ่านบนหน้าจอนานๆ วิธีการหนึ่งที่ผมใช้คือ ผมจะแปลงไฟล์ manual page ให้เป็นไฟล์ HTML โดยใช้คำสั่ง man2html ก่อนเพื่อนำไปสั่งพิมพ์ ซึ่งข้อดีนอกจากการจัดรูปแบบตัวอักษรของไฟล์ HTML แล้ว ยังมีการสร้างลิ้งค์เชื่อมโยงในแต่ละหัวข้อให้ด้วย ซึ่งจะสะดวกในการอ้างอิง ไฟล์ man page บนลินุกซ์จะถูกเก็บไว้ใน /usr/share/man/ โดยจะถูกแบ่งย่อยเป็น directory ต่างๆ เช่น man1, man2, man3 ตามแต่ประเภทของคำสั่ง ตัวอย่างเช่นไฟล์ man page ของคำสั่ง ls คือ /usr/share/man/man1/ls.1.gz ซึ่งไฟล์จริงๆ จะเป็นไฟล์ชนิดที่เรียกว่า troff และจะถูก gzip ไว้ ตัวอย่างของไฟล์ man [...]]]></description>
			<content:encoded><![CDATA[<p>man page บางคำสั่งบน Linux/UNIX นั้น นอกจากจะอธิบายวิธีการใช้งานโปรแกรมแล้ว จะพูดถึงพื้นฐานของคำสั่งนั้นด้วยด้วย บางคำสั่งมีขนาดยาวมากๆ หลายหน้าจอ ซึ่งอาจไม่สะดวกอ่าน หรือทำให้เมื่อยล้าต่อการศึกษาทำความเข้าใจ โดยเฉพาะส่วนตัวผมเองนั้น ไม่ชอบการอ่านบนหน้าจอนานๆ</p>
<p>วิธีการหนึ่งที่ผมใช้คือ ผมจะแปลงไฟล์ manual page ให้เป็นไฟล์ HTML โดยใช้คำสั่ง man2html ก่อนเพื่อนำไปสั่งพิมพ์ ซึ่งข้อดีนอกจากการจัดรูปแบบตัวอักษรของไฟล์ HTML แล้ว ยังมีการสร้างลิ้งค์เชื่อมโยงในแต่ละหัวข้อให้ด้วย ซึ่งจะสะดวกในการอ้างอิง</p>
<p><span id="more-92"></span></p>
<p>ไฟล์ man page บนลินุกซ์จะถูกเก็บไว้ใน /usr/share/man/ โดยจะถูกแบ่งย่อยเป็น directory ต่างๆ เช่น man1, man2, man3 ตามแต่ประเภทของคำสั่ง ตัวอย่างเช่นไฟล์ man page ของคำสั่ง ls คือ /usr/share/man/man1/ls.1.gz ซึ่งไฟล์จริงๆ จะเป็นไฟล์ชนิดที่เรียกว่า troff และจะถูก gzip ไว้</p>
<p>ตัวอย่างของไฟล์ man page ของคำสั่ง ls</p>
<pre>[root@server ~]# <strong>cd /tmp
</strong>[root@server tmp]# <strong>cp /usr/share/man/man1/ls.1.gz </strong></pre>
<pre>[root@server tmp]# <strong>ls -l ls.1.gz
</strong>-rw-r--r-- 1 root root 3025 2008-08-24 01:32 ls.1.gz</pre>
<pre>[root@server tmp]# <strong>gzip -dv ls.1.gz
</strong>ls.1.gz:         60.0% -- replaced with ls.1</pre>
<pre>[root@server tmp]# <strong>file ls.1
</strong>ls.1: troff or preprocessor input text</pre>
<pre>[root@server tmp]# <strong>head ls.1
</strong>.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.35.
.TH LS "1" "January 2008" "GNU coreutils 6.9.92.4-f088d-dirty" "User Commands"
.SH NAME
ls \- list directory contents
.SH SYNOPSIS
.B ls
[\fIOPTION\fR]... [\fIFILE\fR]...
.SH DESCRIPTION
.\" Add any additional description here
.PP
...</pre>
<p>เราจะใช้คำสั่ง man2html เพื่อแปลไฟล์ man page นี้เป็น HTML สำหรับการพิมพ์</p>
<p>ตัวอย่างการใช้คำสั่ง man2html</p>
<pre>[root@server tmp]# <strong>man2html ls.1  &gt; ls.html
</strong>[root@server tmp]# <strong>head ls.html
</strong>Content-type: text/html</pre>
<pre>&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;Manpage of LS&lt;/TITLE&gt;
&lt;/HEAD&gt;&lt;BODY&gt;
&lt;H1&gt;LS&lt;/H1&gt;
Section: User Commands (1)&lt;BR&gt;Updated: January 2008&lt;BR&gt;&lt;A HREF="#index"&gt;Index&lt;/A&gt;
&lt;A HREF="http://localhost/cgi-bin/man/man2html"&gt;Return to Main Contents&lt;/A&gt;&lt;HR&gt;</pre>
<pre>&lt;A NAME="lbAB"&gt;&amp;nbsp;&lt;/A&gt;
&lt;H2&gt;NAME&lt;/H2&gt;
...</pre>
<p>ซึ่งไฟล์ HTML ที่สร้างได้ จะมีการจัดรูปแบบตัวอักษร เช่นตัวหนา หรือทำลิ้งค์เชื่อมโยงในแต่ละหัวข้อได้ด้วย</p>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2008/08/format_manual_page_to_html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux Shell : การใช้คำสั่ง grep เพื่อค้นหาคำในไฟล์</title>
		<link>http://spalinux.com/2008/08/using_grep_find_pattern_in_file</link>
		<comments>http://spalinux.com/2008/08/using_grep_find_pattern_in_file#comments</comments>
		<pubDate>Fri, 01 Aug 2008 18:53:33 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Linux Shell]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=68</guid>
		<description><![CDATA[วิธีการทำงานของคำสั่ง grep คือจะอ่านไฟล์ที่เราต้องการค้นหาทีละบรรทัด แล้วดูว่าตรง (match) กับคำหรือรูปแบบที่เราต้องการค้นหาหรือไม่ ซึ่งผลลัพธ์โดยดีฟอลต์ที่ได้จากการรันคำสั่ง จะแสดงผลลัพธ์เป็นบรรทัดต่างๆ ที่ตรงกับคำหรือรูปแบบนั้นๆ วิธีการใช้คำสั่ง $ grep [OPTION] [FILE] เราจะทดลองใช้คำสั่ง grep กับไฟล์ /etc/passwd เพื่อหาข้อมูลที่ต้องการ โดยไฟล์ /etc/passwd นี้จะมีรูปแบบการเก็บแยกเป็นบรรทัดอยู่แล้ว ตัวอย่างไฟล์ /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown ... เริ่มต้นการใช้คำสั่ง grep เริ่มต้นสมมติว่าเราต้องการหาคำว่า root ในไฟล์ /etc/passwd ว่ามีอยู่ในบรรทัดใดบ้าง สามารถทำได้ดังนี้ $ grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ผลลัพธ์ที่ได้จะแสดงบรรทัดที่มีคำว่า root อยู่ด้วย แสดงเลขบรรทัด (-n) สามารถแสดงเลขบรรทัดในผลลัพธ์โดยการใส่ option -n ในคำสั่ง [...]]]></description>
			<content:encoded><![CDATA[<p>วิธีการทำงานของคำสั่ง grep คือจะอ่านไฟล์ที่เราต้องการค้นหาทีละบรรทัด แล้วดูว่าตรง (match) กับคำหรือรูปแบบที่เราต้องการค้นหาหรือไม่ ซึ่งผลลัพธ์โดยดีฟอลต์ที่ได้จากการรันคำสั่ง จะแสดงผลลัพธ์เป็นบรรทัดต่างๆ ที่ตรงกับคำหรือรูปแบบนั้นๆ</p>
<p><span id="more-68"></span></p>
<p><strong>วิธีการใช้คำสั่ง</strong></p>
<pre>$ grep [OPTION] [FILE]</pre>
<p>เราจะทดลองใช้คำสั่ง grep กับไฟล์ /etc/passwd เพื่อหาข้อมูลที่ต้องการ โดยไฟล์ /etc/passwd นี้จะมีรูปแบบการเก็บแยกเป็นบรรทัดอยู่แล้ว</p>
<p>ตัวอย่างไฟล์ /etc/passwd</p>
<pre>root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...</pre>
<p><strong>เริ่มต้นการใช้คำสั่ง grep</strong><br />
เริ่มต้นสมมติว่าเราต้องการหาคำว่า root ในไฟล์ /etc/passwd ว่ามีอยู่ในบรรทัดใดบ้าง สามารถทำได้ดังนี้</p>
<pre>$ <strong>grep root /etc/passwd</strong>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin</pre>
<p>ผลลัพธ์ที่ได้จะแสดงบรรทัดที่มีคำว่า root อยู่ด้วย</p>
<p><strong>แสดงเลขบรรทัด (-n)</strong><br />
สามารถแสดงเลขบรรทัดในผลลัพธ์โดยการใส่ option -n ในคำสั่ง grep</p>
<pre>$ <strong>grep -n root /etc/passwd</strong>
<span style="color: #ff0000;">1:</span>root:x:0:0:root:/root:/bin/bash
<span style="color: #ff0000;">12:</span>operator:x:11:0:operator:/root:/sbin/nologin</pre>
<p>ผลลัพธ์จะมีเลขที่บรรทัดกำกับมาด้วย ในที่นี้ คือ 1 และ 12 ก็คือบรรทัดที่ 1 และ 12 นั่นเอง</p>
<p><strong>ไม่แสดงบรรทัดที่มีคำที่ต้องการ (-v)</strong><br />
เช่นเราไม่ต้องการบรรทัดที่มีคำว่า root ก็สามารถทำได้โดยเพิ่ม option -v ลงไป</p>
<pre>$ <strong>grep -v root /etc/passwd</strong>
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
...</pre>
<p>ผลลัพธ์ที่ได้จะแสดงบรรทัดอื่นๆ ที่ไม่มีคำว่า root</p>
<p><strong>ระบุรูปแบบในการค้นหา (-E)</strong><br />
ในคำสั่ง grep เราสามารถระบุรูปแบบ (pattern) ในการค้นหาได้หลายแบบ แบบที่นิยมกันอย่างหนึ่งคือใช้ REGULAR EXPRESSION ในที่นี้ต้องใส่ option -E โดยสามารถใช้ REGULAR EXPRESSION เช่นเดียวกับเวลาเราใช้ในการเขียนโปรแกรมภาษาต่างๆ</p>
<p>ตัวอย่างเช่นหาบรรทัดที่ขึ้นต้นด้วยตัวอักษร s</p>
<pre>$ <strong>grep -E ^s /etc/passwd</strong>
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
smolt:x:497:493:Smolt:/usr/share/smolt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
squid:x:23:23::/var/spool/squid:/sbin/nologin</pre>
<p>จากตัวอย่างเราใช้เคื่องหมาย ^ เพื่อระบุว่าตัวอักษรที่ตามมานั้นเป็นตัวอักษรเริ่มต้นของบรรทัด</p>
<p><strong>ค้นหาจากหลายๆ ไฟล์</strong><br />
บางครั้งมีหลายไฟล์ที่เราต้องการค้นหานั้น ก็สามารถทำได้โดยระบุชื่อไฟล์เป็น * ได้</p>
<p>เช่นค้นหาคำว่า root จากทุกไฟล์ใน /etc/</p>
<pre>$ <strong>grep root /etc/*</strong>
/etc/aliases:postmaster:     root
/etc/aliases:bin:            root
...
/etc/group:root:x:0:root
/etc/group:bin:x:1:root,bin,daemon
/etc/group:daemon:x:2:root,bin,daemon
...
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/passwd-:root:x:0:0:root:/root:/bin/bash
...
/etc/rc.sysinit:             if [ "$owner" != root ]; then
/etc/rc.sysinit:if [ -f /etc/sysconfig/readonly-root ]; then
/etc/rc.sysinit:     . /etc/sysconfig/readonly-root
..</pre>
<p>ผลลัพธ์ที่ได้จะแสดงชื่อไฟล์นำหน้าบรรทัดที่มีคำว่า root</p>
<p>ถ้าต้องการค้นหาภายใต้ sub-directory ย่อยๆ ลงไปด้วย ให้เพิ่ม option -r หลังคำสั่ง grep</p>
<p><strong>ข้อมูลอ้างอิง</strong></p>
<ul>
<li>grep(1) manual page</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2008/08/using_grep_find_pattern_in_file/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Linux Shell : ดึงฟิลด์ที่ต้องการด้วยคำสั่ง cut</title>
		<link>http://spalinux.com/2008/07/linux_shell_using_cut</link>
		<comments>http://spalinux.com/2008/07/linux_shell_using_cut#comments</comments>
		<pubDate>Mon, 28 Jul 2008 17:27:42 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Linux Shell]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=63</guid>
		<description><![CDATA[ในบทความนี้จะอธิบายการใช้คำสั่ง cut และเปรียบเทียบความเร็วที่ได้ ระหว่างการใช้คำสั่ง cut และการเขียนโปรแกรมเป็น PHP เพื่อดึงฟิลด์ที่ต้องการจากไฟล์ โดยใช้คำสั่ง time เพิ่มต่อหน้าการรันคำสั่งเพื่อแสดงผลเวลาที่ใช้ไปในการประมวลผล โจทย์ : มีไฟล์ที่เป็นรูปแบบตัวหนังสือ (text-based) โดยในแต่ละบรรทัดเก็บข้อมูลเป็นฟิลด์ต่างๆ ที่อยู่ในรูปแบบเดียวกัน คั่นด้วยเครื่องหมาย , (comma) : (colon) หรืออื่นๆ ความต้องการคือ ให้ดึงเฉพาะฟิลด์ที่ 3 ออกมาจากไฟล์ มาแสดงผลออกหน้าจอ ตัวอย่างเช่นไฟล์ /etc/passwd ซึ่งจะเก็บข้อมูลต่างๆ ของบัญชีผู้ใช้งาน (User Account) บนระบบ UNIX/Linux โดยฟิลด์ต่างๆ จะคั่นด้วยเครื่องหมาย : colon ตัวอย่างไฟล์ /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin ... ความหมายของแต่ละฟิลด์ใน /etc/passwd คือ 1. ชื่อบัญชีผู้ใช้ (User Account) 2. [...]]]></description>
			<content:encoded><![CDATA[<p>ในบทความนี้จะอธิบายการใช้คำสั่ง cut และเปรียบเทียบความเร็วที่ได้ ระหว่างการใช้คำสั่ง cut และการเขียนโปรแกรมเป็น PHP เพื่อดึงฟิลด์ที่ต้องการจากไฟล์ โดยใช้คำสั่ง time เพิ่มต่อหน้าการรันคำสั่งเพื่อแสดงผลเวลาที่ใช้ไปในการประมวลผล</p>
<p>โจทย์ : มีไฟล์ที่เป็นรูปแบบตัวหนังสือ (text-based) โดยในแต่ละบรรทัดเก็บข้อมูลเป็นฟิลด์ต่างๆ ที่อยู่ในรูปแบบเดียวกัน คั่นด้วยเครื่องหมาย , (comma) : (colon) หรืออื่นๆ</p>
<p>ความต้องการคือ ให้ดึงเฉพาะฟิลด์ที่ 3 ออกมาจากไฟล์ มาแสดงผลออกหน้าจอ</p>
<p>ตัวอย่างเช่นไฟล์ /etc/passwd ซึ่งจะเก็บข้อมูลต่างๆ ของบัญชีผู้ใช้งาน (User Account) บนระบบ UNIX/Linux โดยฟิลด์ต่างๆ จะคั่นด้วยเครื่องหมาย : colon</p>
<p><span id="more-63"></span></p>
<p>ตัวอย่างไฟล์ /etc/passwd</p>
<pre>root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...</pre>
<p>ความหมายของแต่ละฟิลด์ใน /etc/passwd คือ<br />
1. ชื่อบัญชีผู้ใช้ (User Account)<br />
2. รหัสผ่าน (Password)<br />
3. เลขประจำตัวผู้ใช้ (User ID)<br />
4. เลขประจำตัวกลุ่ม (Group ID)<br />
5. รายละเอียดเพิ่มเติมของผู้ใช้งาน เช่น ชื่อ นามสกุล (GECOS)<br />
6. Home Directory ของผู้ใช้<br />
7. Shell</p>
<p><strong>การใช้คำสั่ง cut เพื่อดึงฟิลด์ที่ต้องการ</strong><br />
คำสั่ง cut ส่วนใหญ่แล้วจะมีทุก Linux ซึ่งสามารถเรียกใช้งานได้เลย ไม่ต้องลงโปรแกรมเพิ่มเติม โดยจะมีรูปแบบการรัน คือ</p>
<pre>cut [OPTION]  [FILE]</pre>
<p>ส่วนมากแล้วจะใช้อยู่สอง option คือ</p>
<ul>
<li>–d เพื่อระบุอักขระที่ใช้คั่นแต่ละฟิลด์</li>
<li>-f ระบุลำดับที่ของฟิลด์ที่ต้องการแสดงผล เลข 1 หมายถึงฟิลด์แรก</li>
</ul>
<p>[FILE] คือชื่อไฟล์</p>
<p>ตัวอย่างการใช้คำสั่ง cut เพื่อดึงฟิลด์ที่ 3 จากไฟล์ /etc/passwd โดยระบุ : (colon) เป็นตัวคั่นฟิลด์ (-d:) และดึงเฉพาะฟิลด์ที่ 3 (-f3)</p>
<pre>$ <strong>time cut -d: -f3 /etc/passwd</strong>
0
1
2
3
...

real    0m0.011s
user    0m0.000s
sys     0m0.006s</pre>
<p>ผลลัพธ์เมื่อใช้คำสั่ง time เพิ่มด้านหน้า จะมีส่วนของเวลาที่ใช้ในการรันคำสั่งด้วยต่อท้ายในผลลัพธ์ออกมาด้วย ในที่นี้เราจะสนใจค่าเวลาในบรรทัด real เท่านั้น ซึ่งใช้เวลา 0.011 วินาที ในการประมวลผลของคำสั่ง cut เพื่อดึงฟิลด์ที่ 3 ออกมาจากไฟล์</p>
<p><strong>เขียนโปรแกรม PHP เพื่อดึงฟิลด์ที่ต้องการ</strong><br />
ตัวอย่างโปรแกรม PHP เพื่ออ่านไฟล์ /etc/passwd ออกมา และดึงเฉพาะฟิลด์ที่ 3 ที่คั่นด้วยเครื่องหมาย : (colon)</p>
<pre>#!/usr/bin/php -q
&lt;?php
$fh = fopen("passwd", "r");
while ($fields = fgetcsv($fh, 1000, ":")) {
    echo $fields[2] . "\n";
}
fclose($fh);
?&gt;</pre>
<p>หมายเหตุ ใน PHP เวลาระบุฟิลด์ที่ได้จาก fgetcsv ฟิลด์แรกจะเป็นหมายเลข 0</p>
<p>บันทึกโปรแกรมเป็นชื่อไฟล์ get_uid_from_passwd.php แล้วเปลี่ยนโหมดให้รันได้ (+x) จากนั้นใช้คำสั่ง time เพื่อจับเวลาในการรันคำสั่ง</p>
<pre>$ <strong>chmod +x get_uid_from_passwd.php</strong>
$ <strong>time ./get_uid_from_passwd.php</strong>
0
1
2
3
...

real    0m0.170s
user    0m0.007s
sys     0m0.096s</pre>
<p>จะได้ผลลัพธ์เหมือนกัน แต่เวลาที่ได้จะมากกว่า คือต้องใช้เวลา 0.17 วินาทีในการประมวลผล</p>
<p>ทดลองทำดูหลายๆ ครั้ง ผลลัพธ์ที่ได้การเขียนโปรแกรมภาษา PHP เพื่อดึงฟิลด์ที่ต้องการจะใช้เวลามากกว่าการใช้คำสั่ง cut</p>
<p><strong>สรุปผลการทดลอง</strong><br />
บทความนี้เป็นบทความเริ่มต้นสำหรับแนะนำคำสั่งที่มีอยู่แล้วบน Linux เกือบทุกประเภท ทางทีมงาน SpaLinux.com จะพยายามรวบรวมคำสั่งที่เป็นประโยชน์ โดยจะตั้งชื่อหัวข้อเป็น Linux Shell เพื่อช่วยงานประจำวันของผู้ดูแลระบบ ซึ่งงานบางงานโดยเฉพาะการประมวลผลเกี่ยวกับไฟล์ที่เป็นตัวหนังสือ (text-based) เพื่อดึงข้อมลบางอย่างออกมานั้น ไม่จำเป็นต้องเขียนเป็นโปรแกรมเลย ไม่ว่าจะเป็น PHP, Perl, Python, ใช้แค่คำสั่งบน Shell เท่านั้น ทั้งประสิทธิภาพเวลาที่ใช้ในการประมวลผล ยังดีกว่า และเร็วกว่าอีกด้วย</p>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2008/07/linux_shell_using_cut/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

