<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[小小工程師的日常筆記]]></title> 
<link>https://xdeath.tw/index.php</link> 
<description><![CDATA[]]></description> 
<language>zh-tw</language> 
<copyright><![CDATA[小小工程師的日常筆記]]></copyright>
<item>
<link>https://xdeath.tw/read.php?85</link>
<title><![CDATA[如何建立Line 聊天機器人]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Mon, 10 May 2021 03:45:30 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?85</guid> 
<description>
<![CDATA[ 
	在台灣幾乎每個人都有Line帳號，很多公事、同學聯繫也都依靠LINE<br/><br/>這篇文章就是紀錄怎麼開發一個LINE聊天機器人，能夠主動發送訊息<br/><br/>取代以往用簡訊或EMAIL提醒的功能，畢竟大家會去看LINE的頻率應該<br/><br/>比打開手機/電腦看email的頻率要高吧。<br/><br/><strong><span style="color: #FF0000;"><span style="font-size: 18px;">[建立機器人]</span></span></strong><br/><br/>首先從<a href="https://developers.line.biz/console/?status=success" target="_blank">網頁</a>上登入進入developers，登入你的line帳號後<br/><br/>建立一個channels，進入MessageAPI中，可以取得你的Channel access token<br/><br/>接著再Basic Setting中可以找到你的Channel secret，以及user id，先把這<br/><br/>幾個資訊記錄下來。<br/><br/>接著到MessageAPI中，有一個QR code，妳可以開啟你的LINE掃描，就可以將<br/><br/>這個line機器人加入成為朋友了；在這邊你也可以設定是否可以自動加入朋友<br/><br/>自動回覆訊息、加入好友歡迎訊息等設定，基本上一個沒有任何功能的機器人。<br/><br/>就完成了。<br/><br/><strong><span style="color: #FF0000;"><span style="font-size: 18px;">[傳送與回覆訊息]</span></span></strong><br/><br/>line機器人傳送訊息只是透過簡單的WEB API，再header加上剛剛取得的access token<br/><br/>並將要傳送的對象，訊息內容用json格式包起來<br/><br/>以php為例<br/><br/>傳送給某一位朋友或是一個聊天室<br/><br/><div class="code"><br/>function push($message)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;global $channelAccessToken;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$payload = &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;to&#039; =&gt; &quot;要傳送對象的userID&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;messages&#039; =&gt; &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;type&#039; =&gt; &#039;text&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;text&#039; =&gt; $message<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#93;;<br/>// Send Request by CURL<br/>&nbsp;&nbsp;&nbsp;&nbsp;$ch = curl_init();<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_URL, &#039;https://api.line.me/v2/bot/message/push&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_POST, true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &#039;POST&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_HTTPHEADER, &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;Content-Type: application/json&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;Authorization: Bearer &#039; . $channelAccessToken<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$result = curl_exec($ch);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);<br/>&#125; <br/></div><br/><br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script>&nbsp;&nbsp;<br/><br/>在payload中放入要傳送的對象以及內容即可(如何取得userid或是group id後面會再提到)。<br/><br/>傳送給所有人的話方法一樣，URL改成https://api.line.me/v2/bot/message/multicast 即可<br/><br/>若機器人單純只是要主動傳送訊息到這邊即可。<br/><br/><strong><span style="color: #FF0000;"><span style="font-size: 18px;">[接收訊息以及webhook]</span></span></strong><br/><br/>在MessageAPI中有一個webhook設定，webhook是類似一個中介的作用，可以攔截所有的原始訊息<br/><br/>可以透過webhook找到使用者/群組的ID，也可以依據使用者傳送的訊息進行回覆。<br/><br/>首先你必須要申請一個網站，以及https的憑證，設定完Webhook URL後點下verify，顯示成功後<br/><br/>接著到webhook的網頁上放上這兩行<br/><br/>$json_string = file_get_contents('php://input');<br/><br/>error_log($json_string);<br/><br/>接著到聊天室中隨便點傳一個訊息，在/var/log/httpd/ssl_error_log中就可以看到類似下面的內容<br/><br/><div class="code"><br/>&#123;<br/>&nbsp;&nbsp;&quot;destination&quot;:&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;,<br/>&nbsp;&nbsp;&quot;events&quot;:<br/>&nbsp;&nbsp;&#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;type&quot;:&quot;message&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;message&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;type&quot;:&quot;text&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;id&quot;:&quot;xxxxxxxxxxxxxxxxxxxx&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;text&quot;:&quot;123&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;timestamp&quot;:1620617008589,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;source&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;type&quot;:&quot;user&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;userId&quot;:&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;&nbsp;&nbsp;#從這邊可以取得你的ID，或是群組的ID<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;replyToken&quot;:&quot;token&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#如果要回覆訊息需要加上這個token<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;mode&quot;:&quot;active&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#93;<br/>&#125;<br/></div><br/><br/>可以看到詳細的一些內容，要回覆訊息的話就是依據text的內容去呼叫reply得函式<br/><br/>以下的範例就是當收到有人說"測試"時，使用reply回覆"測試回覆"。<br/><br/><div class="code"><br/>&nbsp;&nbsp;&nbsp;&nbsp;$access_token =&#039;access_token&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$json_string = file_get_contents(&#039;php://input&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$json_obj = json_decode($json_string);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$event = $json_obj-&gt;&#123;&quot;events&quot;&#125;&#91;0&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $event-&gt;&#123;&quot;message&quot;&#125;-&gt;&#123;&quot;text&quot;&#125;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$reply_token = $event-&gt;&#123;&quot;replyToken&quot;&#125;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if($message == &quot;測試&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply(&quot;測試回覆&quot;,$reply_token);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;function reply($message,$reply_token)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global $access_token;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$post_data = &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;replyToken&quot; =&gt; $reply_token,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;messages&quot; =&gt; &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;type&quot; =&gt; &quot;text&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;text&quot; =&gt; $message<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ch = curl_init(&quot;https://api.line.me/v2/bot/message/reply&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_POST, true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &#039;POST&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_HTTPHEADER, array(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;Content-Type: application/json&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;Authorization: Bearer &#039;.$access_token<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result = curl_exec($ch);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/></div><br/><br/>PS：Line機器人有付費的版本也有免費的版本，免費版有限制每個月可以"主動"發送訊息的數量，但是回覆訊息的<br/><br/>數量是沒有限制的。
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?84</link>
<title><![CDATA[python 文件模板Template]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[python]]></category>
<pubDate>Fri, 06 Nov 2020 06:02:30 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?84</guid> 
<description>
<![CDATA[ 
	當有一個很大的文件檔，內容幾乎都是相同，只是其中某些變數要取代掉的時候<br/><br/>例如一個很大的XML文件，每次的內容幾乎都一樣，只是有一些傳送對象<br/><br/>時間、ID、敘述的部分可能不一樣的時候，這時候使用正規的xml就顯得很麻煩<br/><br/>這時候就很適合使用Template將XML中這幾個內容進行替換。<br/><br/>首先先建立一個範例的文件檔sample.xml，其中要更換的內容則使用$&#123;XX&#125;作為標記<br/><br/><div class="code"><br/>?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&lt;catalog&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;product&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pname&gt;$&#123;PNAME&#125;&lt;/pname&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;price currency=&quot;NT&quot;&gt;$&#123;PRICE&#125;&lt;/price&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mark /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/product&gt;<br/>&lt;/catalog&gt; <br/></div><br/><br/>這裡的pname就是產品名稱，price就是產品價格，接著我們進行替換<br/><br/><div class="code"><br/>from string import Template<br/>with open(&#039;sample.xml&#039;) as fr:<br/>&nbsp;&nbsp;&nbsp;&nbsp;data = fr.read()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #讀入檔案內容<br/>data = Template(data)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #將內容當作範本<br/>data = data.safe_substitute(PNAME=&#039;IPHONE 12&#039;, PRICE=&#039;30000&#039;)&nbsp;&nbsp;&nbsp;&nbsp; #進行替換<br/>print(data)<br/></div><br/><br/>這時候就會看到以下的內容<br/><br/><div class="code"><br/>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br/>&lt;catalog&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;product&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;pname&gt;IPHONE 12&lt;/pname&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;price currency=&quot;NT&quot;&gt;30000&lt;/price&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mark /&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/product&gt;<br/>&lt;/catalog&gt;<br/></div>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?83</link>
<title><![CDATA[vmware中centos 7增加硬碟空間]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[linux]]></category>
<pubDate>Mon, 21 Sep 2020 18:25:04 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?83</guid> 
<description>
<![CDATA[ 
	首先將虛擬機關機後，第一步要先增加系統HD的容量<br/><br/>如果你的centos是安裝在PC上的vmware workstation上的話<br/><br/>安裝的目錄上有一個vmware-vdiskmanager.exe的命令可以使用<br/><br/>在cmd的模式下執行(擴充到50G)<br/><br/>如果這個guest os沒有做任何的snapshop的話，在設定->硬碟中<br/><br/>還有一個expand的選項可以直接增加硬碟的容量<br/><br/>vmware-vdiskmanager.exe -x 50G guestos.vmdk(實際占很大空間的那個檔案)<br/><br/>如果是安裝在Esxi上的話，則是使用vmkfstools<br/><br/>vmkfstools -X 50G guestos.vmdk<br/><br/>到這邊guest os的硬碟容量應該已經擴充到50G了，但是實際上我們系統用df看還是很小<br/><br/>這是因為多出來的空間現在都是無法辨識的狀態，如果是guest是windows系統的話<br/><br/>則只需要在磁碟管理中去調整硬碟空間大小就可以了，Centos則是需要依照以下的步驟<br/><br/>首先看一下系統用了多少容量<br/><br/><div class="code"><br/>&#91;root@localhost ~&#93;# df -h<br/>檔案系統&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 容量&nbsp;&nbsp;已用&nbsp;&nbsp;可用 已用% 掛載點<br/>devtmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 470M&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;470M&nbsp;&nbsp;&nbsp;&nbsp;0% /dev<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;487M&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;487M&nbsp;&nbsp;&nbsp;&nbsp;0% /dev/shm<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;487M&nbsp;&nbsp;8.4M&nbsp;&nbsp;478M&nbsp;&nbsp;&nbsp;&nbsp;2% /run<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;487M&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;487M&nbsp;&nbsp;&nbsp;&nbsp;0% /sys/fs/cgroup<br/>&#91;color=#FF0000&#93;/dev/mapper/centos-root&nbsp;&nbsp; 17G&nbsp;&nbsp;4.8G&nbsp;&nbsp; 13G&nbsp;&nbsp; 28% /&#91;/color&#93;<br/>/dev/sda1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1014M&nbsp;&nbsp;173M&nbsp;&nbsp;842M&nbsp;&nbsp; 17% /boot<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 98M&nbsp;&nbsp; 12K&nbsp;&nbsp; 98M&nbsp;&nbsp;&nbsp;&nbsp;1% /run/user/42<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 98M&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 98M&nbsp;&nbsp;&nbsp;&nbsp;0% /run/user/1000<br/></div><br/><br/>看起來系統只用了20G，接著檢查硬碟<br/><br/><div class="code"><br/>&#91;root@localhost ~&#93;# fdisk -l<br/><br/>Disk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors<br/>Units = sectors of 1 * 512 = 512 bytes<br/>Sector size (logical/physical): 512 bytes / 512 bytes<br/>I/O 大小 (最小/最佳化)：512 位元組 / 512 位元組<br/>Disk label type: dos<br/>磁碟識別碼：0x000c35eb<br/><br/>所用裝置 開機&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;開始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 結束&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;區塊&nbsp;&nbsp; 識別號&nbsp;&nbsp;系統<br/>/dev/sda1&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2048&nbsp;&nbsp;&nbsp;&nbsp; 2099199&nbsp;&nbsp;&nbsp;&nbsp; 1048576&nbsp;&nbsp; 83&nbsp;&nbsp;Linux<br/>/dev/sda2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2099200&nbsp;&nbsp;&nbsp;&nbsp;41943039&nbsp;&nbsp;&nbsp;&nbsp;19921920&nbsp;&nbsp; 8e&nbsp;&nbsp;Linux LVM<br/></div><br/><br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script>&nbsp;&nbsp;<br/>可以看到現在/dev/sda確實有53.7G，但是系統實際上只用了20G<br/><br/>使用fdisk新增一個partition(不想看的話fdisk /dev/sda後打p、n、p、3、w)<br/><br/><div class="code"><br/>&#91;root@localhost ~&#93;# fdisk /dev/sda<br/>Welcome to fdisk (util-linux 2.23.2).<br/><br/>Changes will remain in memory only, until you decide to write them.<br/>Be careful before using the write command.<br/><br/><br/>命令 (m 以獲得說明)：p<br/><br/>Disk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors<br/>Units = sectors of 1 * 512 = 512 bytes<br/>Sector size (logical/physical): 512 bytes / 512 bytes<br/>I/O 大小 (最小/最佳化)：512 位元組 / 512 位元組<br/>Disk label type: dos<br/>磁碟識別碼：0x000c35eb<br/><br/>所用裝置 開機&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;開始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 結束&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;區塊&nbsp;&nbsp; 識別號&nbsp;&nbsp;系統<br/>/dev/sda1&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2048&nbsp;&nbsp;&nbsp;&nbsp; 2099199&nbsp;&nbsp;&nbsp;&nbsp; 1048576&nbsp;&nbsp; 83&nbsp;&nbsp;Linux<br/>/dev/sda2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2099200&nbsp;&nbsp;&nbsp;&nbsp;41943039&nbsp;&nbsp;&nbsp;&nbsp;19921920&nbsp;&nbsp; 8e&nbsp;&nbsp;Linux LVM<br/><br/>命令 (m 以獲得說明)：n<br/>Partition type:<br/>&nbsp;&nbsp; p&nbsp;&nbsp; primary (2 primary, 0 extended, 2 free)<br/>&nbsp;&nbsp; e&nbsp;&nbsp; extended<br/>Select (default p): p<br/>分割區編號 (3,4, default 3): 3<br/>起初 sector (41943040-104857599, 預設 41943040)：<br/>使用預設值 41943040<br/>最後 sector, +sectors 或 +大小&#123;K,M,G&#125; (41943040-104857599, 預設 104857599)：<br/>使用預設值 104857599<br/>Partition 3 of type Linux and of size 30 GiB is set<br/><br/>命令 (m 以獲得說明)：w<br/>分割表已變更！<br/><br/>呼叫 ioctl() 以重新讀取分割表。<br/><br/>WARNING: Re-reading the partition table failed with error 16: 裝置或系統資源忙碌中.<br/>The kernel still uses the old table. The new table will be used at<br/>the next reboot or after you run partprobe(8) or kpartx(8)<br/>同步磁碟。<br/></div><br/><br/>到這邊用fdisk -l就會看到多了一個/dev/sda3<br/><br/>接著要create一個Volume，並且重新設定大小，接著進行擴展<br/><div class="code"><br/>&#91;root@localhost ~&#93;# partprobe<br/>Warning: 無法開啟 /dev/sr0 以讀寫 (唯讀的檔案系統)。/dev/sr0 已用唯讀的方式開啟<br/>&#91;root@localhost ~&#93;# pvcreate /dev/sda3<br/>&nbsp;&nbsp;Physical volume &quot;/dev/sda3&quot; successfully created.<br/>&#91;root@localhost ~&#93;# pvresize /dev/sda3<br/>&nbsp;&nbsp;Physical volume &quot;/dev/sda3&quot; changed<br/>&#91;root@localhost ~&#93;# vgextend centos /dev/sda3<br/>&nbsp;&nbsp;Volume group &quot;centos&quot; successfully extended<br/>&#91;root@localhost ~&#93;# lvextend -L +29G /dev/mapper/centos-root<br/>&nbsp;&nbsp;Size of logical volume centos/root changed from &lt;46.00 GiB (11775 extents) to&nbsp;&nbsp;&lt;54.00 GiB (13823 extents).<br/>&#91;root@localhost ~&#93;# xfs_growfs /dev/mapper/centos-root<br/></div><br/>這時候再用df -h看，就會發現根目錄變大了<br/><div class="code"><br/>&#91;root@localhost ~&#93;# df -h<br/>檔案系統&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 容量&nbsp;&nbsp;已用&nbsp;&nbsp;可用 已用% 掛載點<br/>devtmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 470M&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;470M&nbsp;&nbsp;&nbsp;&nbsp;0% /dev<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;487M&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;487M&nbsp;&nbsp;&nbsp;&nbsp;0% /dev/shm<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;487M&nbsp;&nbsp;8.4M&nbsp;&nbsp;478M&nbsp;&nbsp;&nbsp;&nbsp;2% /run<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;487M&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;487M&nbsp;&nbsp;&nbsp;&nbsp;0% /sys/fs/cgroup<br/>&#91;color=#FF0000&#93;/dev/mapper/centos-root&nbsp;&nbsp; 46G&nbsp;&nbsp;4.8G&nbsp;&nbsp; 42G&nbsp;&nbsp; 11% /&#91;/color&#93;<br/>/dev/sda1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1014M&nbsp;&nbsp;173M&nbsp;&nbsp;842M&nbsp;&nbsp; 17% /boot<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 98M&nbsp;&nbsp; 12K&nbsp;&nbsp; 98M&nbsp;&nbsp;&nbsp;&nbsp;1% /run/user/42<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 98M&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 98M&nbsp;&nbsp;&nbsp;&nbsp;0% /run/user/1000<br/>tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 98M&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 98M&nbsp;&nbsp;&nbsp;&nbsp;0% /run/user/0<br/></div><br/><br/>...<br/>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?82</link>
<title><![CDATA[yum 與 pip離線安裝模組]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[linux]]></category>
<pubDate>Mon, 21 Sep 2020 17:29:12 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?82</guid> 
<description>
<![CDATA[ 
	當我們系統安裝在正式環境中，可能前端會有防火牆或是其他網路設備<br/><br/>導致我們沒辦法連線到internet去安裝一些套件，這時候就可以利用離線安裝<br/><br/>的方式，到一台相同版本，但是可以連上internet的機器上，將相關的模組下載下來<br/><br/>傳送到要安裝的系統進行安裝，這樣就可以避免為了安裝某個套件，而去修改防火牆<br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script>&nbsp;&nbsp;<br/>以centos用yum安裝套件來說，如果我要安裝python的virtualenv<br/><br/><div class="code"><br/>#下載目錄為./，要下載的模組是python-virtualenv<br/>yum install --downloadonly --downloaddir=./ python-virtualenv&nbsp;&nbsp; <br/></div><br/><br/>他會把所有依賴的套件全部下載下來，你就會看到在目錄底下有這些檔案<br/><br/>python2-rpm-macros-3-32.el7.noarch.rpm<br/>python-devel-2.7.5-88.el7.x86_64.rpm<br/>python-rpm-macros-3-32.el7.noarch.rpm<br/>python-srpm-macros-3-32.el7.noarch.rpm<br/>python-virtualenv-15.1.0-4.el7_7.noarch.rpm<br/><br/>接著我們可以把這五個檔案傳送到要安裝的系統上，接著一樣使用yum去安裝他<br/><br/><div class="code"><br/>#安裝使用localinstall的方式，nogpgcheck表示不要進行驗證<br/>yum localinstall -y --nogpgcheck python-virtualenv-15.1.0-4.el7_7.noarch.rpm<br/></div><br/><br/>正常來說因為依賴的套件都已經下載傳送過來了，所以就可以直接安裝成功<br/><br/>但是有一種情況是，你在下載的時候，例如已經安裝過python-rpm-macros-3-32.el7.noarch.rpm<br/><br/>那系統會判斷你不需要python-rpm-macros-3-32.el7.noarch.rpm這個套件，就不會下載<br/><br/>這樣傳送過去就會少了這個套件，安裝的時候yum只好再透過internet去找，這時候因為無法連上網際網路<br/><br/>安裝就會失敗，所以使用這種方式的時候要拿來下載套件的機器最好是很乾淨，沒有安裝過太多模組。<br/><br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script>&nbsp;&nbsp;<br/><br/>python的pip也是類似的方式<br/><br/>例如我要安裝django以及flask，首先下載相關模組<br/><br/><div class="code"><br/>pip download django<br/>pip download flask<br/></div><br/><br/>這樣我們就可以取得Django-3.1.1-py3-none-any.whl以及相對應依賴的whl檔案<br/><br/>接著我們把所有whl檔傳送到要安裝的設備上後，直接指定whl進行安裝<br/><br/><div class="code"><br/>pip install Django-3.1.1-py3-none-any.whl<br/>pip install Flask-1.1.2-py2.py3-none-any.whl<br/></div><br/><br/>那如果一次有很多個套件要安裝呢，最簡單的方式我們先用一個乾淨的虛擬環境<br/><br/>安裝好我們所需要的模組<br/><br/><div class="code"><br/>pip install django<br/>pip install flask<br/>#導出模組清單<br/>pip freeze &gt; requirements.txt<br/>#下載requirements.txt中安裝的所有模組<br/>pip download -r requirements.txt<br/></div><br/><br/>接著我們把所有*.whl檔案以及requirements.txt傳到要安裝的設備上<br/><br/>接著就可以使用本地安裝一次安裝好所有套件了<br/><br/><div class="code"><br/>pip install --no-index --find-links=./ -r requirements.txt<br/></div><br/><br/>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?81</link>
<title><![CDATA[如何設定cloudflare的CDN與免費https服務]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Wed, 18 Mar 2020 06:40:33 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?81</guid> 
<description>
<![CDATA[ 
	cloudflare美國加州的一家公司，他們最為人了解的就是免費提供的DNS代管以及CDN的服務<br/><br/>所謂的CDN就是把你的網站內容利用BGP anycast的技術放到cloudflare在世界上多個資料中心內<br/><br/>達到分散流量並且加快網站的連線速度。<br/><br/>首先先到cloudflare的<a href="https://www.cloudflare.com/" target="_blank">網站</a>右上角的sign up註冊一個新帳號<br/><br/>註冊登入後，點選add a site，輸入你註冊的網域名稱(有些免費的無法使用)<br/><br/><a href="https://xdeath.tw/attachment.php?fid=12" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=12" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>接著選擇你的方案，基本上可以先用免費的進行試用，付費版還有更多進階的功能<br/><br/><a href="https://xdeath.tw/attachment.php?fid=13" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=13" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>等大約一分鐘，他會掃描你現在的域名底下有哪些DNS record的設定<br/><br/><a href="https://xdeath.tw/attachment.php?fid=14" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=14" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>第一個欄位是你的網站網址，接著是你現在網站的IP，最後一欄是是否啟用他的proxy<br/><br/><a href="https://xdeath.tw/attachment.php?fid=17" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=17" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>因為我們等等要用cloudflare的https，所以這邊會選擇把proxy啟用<br/><br/>接著我們需要將DNS交給cloudflare進行代管，他會給你兩個dns主機進行設定<br/><br/><a href="https://xdeath.tw/attachment.php?fid=15" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=15" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>接下來你就要到自己註冊DNS的地方設定，你要將DNS指定到cloudflare這兩個DNS主機上<br/><br/>當然設定前還是要先把你原本的DNS所有record手動紀錄一下，之後還是要在cloudflare的DNS<br/><br/>上將這些record重新設定上去。<br/><br/>接著他會問你https的設定，off是不啟用，Flexible就是我們現在要用的<br/><br/><a href="https://xdeath.tw/attachment.php?fid=21" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=21" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>同時把永遠使用https開起來<br/><br/><a href="https://xdeath.tw/attachment.php?fid=17" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=17" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>接著大約等10~15分鐘，cloudflare會進行一些測試，同時DNS也需要一點時間生效<br/><br/>你可以測試ping自己的網站，如果顯示的IP已經不是原本自己的主機IP<br/><br/>同時網頁也可以看到內容，就表示都完成生效了<br/><br/>這樣子使用者要拜訪到你的網站，就會先到cloudflare的proxy<br/><a href="https://xdeath.tw/attachment.php?fid=20" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=20" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/>這一段就會使用cloudflare所簽屬的https憑證<br/><br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script>&nbsp;&nbsp;<br/><br/>接著cloudflare的proxy再透過未加密的http去你的網站真實的IP上取得網站內容回應給使用者<br/><br/>這樣第一個好處就是當被攻擊的時候，cloudflare的proxy會在前面先承受攻擊<br/><br/>而不會直接攻擊到你的網頁伺服器<br/><br/>第二個好處是由於它的憑證是免費的，現在如果自己去簽屬免費的憑證可能三個月就要重新申請一次<br/><br/>如果使用cloudflare的CDN就不會有這種常常要重新申請的困擾。<br/><br/>另外cloudfalre還提供許多加值的服務，例如DNS代管、DNSSEC、防火牆、統計報表...<br/><br/>另外要記得進入DNS將原本設定的其他dns record重新設定上去<br/><br/><a href="https://xdeath.tw/attachment.php?fid=19" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=19" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>其他的非網站的record，如果沒有要經過proxy(例如mail server)記得最後面的proxy就要取消掉<br/><br/>有些需要付費，有些是免費的，大家可以依照自己的需求升級自己的功能<br/><br/>進入主控台後，右邊有一個Active Subscriptions，點選change可以升級你的帳號版本<br/><br/><a href="https://xdeath.tw/attachment.php?fid=20" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=20" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?80</link>
<title><![CDATA[Extensible Provisioning Protocol(EPP)]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[DNS]]></category>
<pubDate>Tue, 14 May 2019 02:15:43 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?80</guid> 
<description>
<![CDATA[ 
	Extensible Provisioning Protocol(EPP)是一個網域名稱註冊的一個標準的協定<br/><br/>早期的每一家註冊局(registry)都有自己的註冊域名的API或是格式<br/><br/>當一家代理註冊商(registrar)要能夠代理不同註冊局的域名時，就會<br/><br/>碰到程式不通用的問題。為了解決這個問題，IETF推出了一個通用格式<br/><br/>Extensible Provisioning Protocol(EPP)，他是一種以XML的標準格式<br/><br/>讓registrar在與各家registry溝通時能夠更方便的傳輸資料。<br/><br/>完整的資料傳輸流程大概是這樣，首先client與EPP server端先建立TCP三方<br/><br/>交握連線，接著進行加密憑證的交換(一般是走加密連線啦，應該很少是明文<br/><br/>傳送)，連線完成之後，首先是SERVER端或傳送一個HELLO，內容是這個EPP SERVER<br/><br/>的相關資訊，使用的EPP版本，是否有extension以及schema，接著client端每<br/><br/>發送一個request，server端就會回應一個response。client首先必須先作login<br/><br/>，server回應登入成功，後續就夠發送要執行動作的request，當連線結束後，client<br/><br/>需要在發送一個logout的指令，或是直接斷開連線，server仍然會發送一個斷開<br/><br/>連線的Response。<br/><br/>整個EPP的指令大概可以分成兩類，一類是連線用指令(login、logout、greet)，<br/><br/>另一類是操作相關物件用(create建立、update更新、delete刪除、transfer移轉<br/><br/>、info查詢資料、check檢查是否存在、renew續用、poll通知)。<br/><br/><br/>一個網域名稱主要分成三個物件，網域名稱(Domain)、聯繫資訊(Contact)、主機資訊(Host)。<br/><br/>當我們要註冊一個網域名稱，因為網域的資料中一定要帶擁有者等相關聯繫資訊<br/><br/>因此必須要先建立個人資料(contact create)，接著才能夠註冊網域名稱(domain create)，<br/><br/>網域建立成功之後僅表示這個網域名稱已經屬於某個人，但是仍然無法運作，接著要建立<br/><br/>Host(Host create)資訊，也就是指定你的DNS主機，DNS才能夠正常解析，才能夠讓這個域<br/><br/>名能夠真正的發揮作用。<br/><br/>所以一個完整註冊的流程大概是這樣的<br/><br/>檢查contact是否存在(contact check)->不存在則註冊contact(contact create)->檢查contact是否存在<br/><br/>要註冊的域名是否存在(domain check)->不存在則註冊域名(domain create)->建立自己的host主機資訊<br/><br/>(host create)->更新域名設定NS(domain update)<br/><br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script>&nbsp;&nbsp;<br/><br/>xml範例：<br/><br/><span style="color: #FF0000;">REQUEST:</span><br/><div class="code"><br/>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;<br/>&nbsp;&nbsp;&lt;epp xmlns=&quot;urn:ietf:params:xml:ns:epp-1.0&quot;&nbsp;&nbsp;<br/>&nbsp;&nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;<br/>&nbsp;&nbsp;xsi:schemaLocation=&quot;urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd&quot;&gt;<br/>&nbsp;&nbsp;&lt;command xmlns=&quot;urn:ietf:params:xml:ns:epp-1.0&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;create&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:create xmlns:domain=&quot;urn:ietf:params:xml:ns:domain-1.0&quot; <br/>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; <br/>&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation=&quot;urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:name&gt;test.com.tw&lt;/domain:name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:period unit=&quot;y&quot;&gt;1&lt;/domain:period&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:registrant&gt;test-contact-001&lt;/domain:registrant&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:contact type=&quot;admin&quot;&gt;test-contact-001&lt;/domain:contact&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:contact type=&quot;tech&quot;&gt;test-contact-001&lt;/domain:contact&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:contact type=&quot;billing&quot;&gt;test-contact-001&lt;/domain:contact&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:authInfo&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:pw&gt;testpass&lt;/domain:pw&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/domain:authInfo&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/domain:create&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/create&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;clTRID&gt;ABC-96803-XYZ&lt;/clTRID&gt;<br/>&nbsp;&nbsp;&lt;/command&gt;<br/>&lt;/epp&gt;<br/></div><br/><span style="color: #FF0000;">RESPONSE:</span><br/><div class="code"><br/>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br/>&lt;epp xmlns=&quot;urn:ietf:params:xml:ns:epp-1.0&quot; <br/>&nbsp;&nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;<br/>&nbsp;&nbsp;xsi:schemaLocation=&quot;urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd&quot;&gt;<br/>&nbsp;&nbsp;&lt;response&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;result code=&quot;1000&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;msg lang=&quot;en-US&quot;&gt;Command completed successfully&lt;/msg&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/result&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;resData&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:creData xmlns:domain=&quot;urn:ietf:params:xml:ns:domain-1.0&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:name&gt;test.com.tw&lt;/domain:name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:crDate&gt;2019-05-13T16:21:58.0Z&lt;/domain:crDate&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:exDate&gt;2020-05-13T16:21:58.0Z&lt;/domain:exDate&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/domain:creData&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/resData&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;trID&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;clTRID&gt;ABC-96803-XYZ&lt;/clTRID&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;svTRID&gt;1557764518-3829-2515&lt;/svTRID&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/trID&gt;<br/>&nbsp;&nbsp;&lt;/response&gt;<br/>&lt;/epp&gt;<br/></div><br/><br/>以上是一個domain create的範例，相關的XML schema都可以在網路上找的到<br/><br/>可以看到要做的動作基本上是被包在command這個tag中，回應中會有一個<br/><br/>result code，1XXX開頭基本上就是成功，其他開頭就是失敗，這個資料在RFC<br/><br/>中都有說明。<br/><br/>使用者的request中必須帶有一個<clTRID>ABC-96803-XYZ</clTRID>，這是一個<br/><br/>代表連線的資訊，回應的時候同時也會帶上這個資訊，表示是回應哪一個request<br/><br/>同時會加上server的一個唯一的連線ID。<br/><br/>如果註冊商有自己特殊的規定或是資訊，EPP也可以另外增加一個extension的欄位<br/><br/>以DNSSEC為例，XML就會多出一個與create同階層的extension的欄位如下<br/><br/><div class="code"><br/>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;<br/>&nbsp;&nbsp;&lt;epp xmlns=&quot;urn:ietf:params:xml:ns:epp-1.0&quot;&nbsp;&nbsp;<br/>&nbsp;&nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;<br/>&nbsp;&nbsp;xsi:schemaLocation=&quot;urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd&quot;&gt;<br/>&nbsp;&nbsp;&lt;command xmlns=&quot;urn:ietf:params:xml:ns:epp-1.0&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;create&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:create xmlns:domain=&quot;urn:ietf:params:xml:ns:domain-1.0&quot; <br/>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; <br/>&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation=&quot;urn:ietf:params:xml:ns:domain-1.0 domain-1.0.xsd&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:name&gt;test.com.tw&lt;/domain:name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:period unit=&quot;y&quot;&gt;1&lt;/domain:period&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:registrant&gt;test-contact-001&lt;/domain:registrant&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:contact type=&quot;admin&quot;&gt;test-contact-001&lt;/domain:contact&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:contact type=&quot;tech&quot;&gt;test-contact-001&lt;/domain:contact&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:contact type=&quot;billing&quot;&gt;test-contact-001&lt;/domain:contact&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:authInfo&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;domain:pw&gt;testpass&lt;/domain:pw&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/domain:authInfo&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/domain:create&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/create&gt;<br/>&nbsp;&nbsp;&lt;extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;secDNS:create xmlns:secDNS=&quot;urn:ietf:params:xml:ns:secDNS-1.1&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation=&quot;urn:ietf:params:xml:ns:secDNS-1.1 secDNS-1.1.xsd&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;secDNS:dsData&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;secDNS:keyTag&gt;9765&lt;/secDNS:keyTag&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;secDNS:alg&gt;5&lt;/secDNS:alg&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;secDNS:digestType&gt;1&lt;/secDNS:digestType&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;secDNS:digest&gt;4141674BFF957211D129B0DFE9410AF753559D4B&lt;/secDNS:digest&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/secDNS:dsData&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/secDNS:create&gt;<br/>&nbsp;&nbsp;&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;clTRID&gt;ABC-96803-XYZ&lt;/clTRID&gt;<br/>&nbsp;&nbsp;&lt;/command&gt;<br/>&lt;/epp&gt;<br/></div><br/><br/>最後附上筆者從github上下載的php client修改後的一個簡單版的client<a href="attachment.php?fid=9">點擊這裡下載檔案</a><br/><br/>解壓縮之後填寫設定檔settings.ini，執行php request.php就可以傳送相關命令了，歡迎大家下載使用。
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?79</link>
<title><![CDATA[PPTP server]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[linux]]></category>
<pubDate>Wed, 03 Apr 2019 06:28:18 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?79</guid> 
<description>
<![CDATA[ 
	[ubuntu]<br/><br/>首先安裝pptp<br/><br/>apt-get install pptpd<br/><br/>修改/etc/pptpd.conf，找到以下兩行，將註解拿掉<br/><br/>localip 192.168.99.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#建議用192.168.99.1之類的，192.168.0.X很容易衝到<br/>remoteip 192.168.99.128-255&nbsp;&nbsp;&nbsp;&nbsp; #連上後取得的private ip，必須與上面同網段<br/><br/>設定/etc/ppp/pptpd-options中的DNS<br/>ms-dns 8.8.8.8&nbsp;&nbsp;&nbsp;&nbsp;#設定DNS<br/><br/>設定/etc/ppp/chap-secrets帳號密碼<br/><br/>帳號&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server&nbsp;&nbsp;&nbsp;&nbsp;密碼&nbsp;&nbsp;&nbsp;&nbsp;允許的IP<br/>username&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; password&nbsp;&nbsp; *<br/><br/>重啟pptpd，service restart pptpd<br/><br/>這時候應該已經可以連線了，只是連進來之後出不去，還需要把forward的功能開起來<br/><br/>修改系統參數 /etc/sysctl.conf<br/><br/>＃net.ipv4.ip_forward=1&nbsp;&nbsp;#取消註解<br/><br/>更新設定 sysctl -p<br/><br/>最後在防火牆裡啟用forward<br/><br/>iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o eth0 -j MASQUERADE&nbsp;&nbsp;<br/><br/>注意-s是VPN網段的IP範圍。<br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script><br/>[centos]<br/><br/>安裝pptpd<br/><br/>yum install pptpd<br/><br/>修改/etc/pptpd.conf設定、系統設定等都與ubuntu相同<br/><br/>修改DNS設定，/etc/ppp/options.pptpd與ubuntu不一樣<br/><br/>修改防火牆開啟forward，修改/etc/sysconfig/iptables檔，在前面加上<br/><br/><div class="code"><br/>*nat<br/>:PREROUTING ACCEPT &#91;4:1992&#93;<br/>:POSTROUTING ACCEPT &#91;0:0&#93;<br/>:OUTPUT ACCEPT &#91;0:0&#93;<br/>-A POSTROUTING -s 192.168.99.0/24 -o eth0 -j MASQUERADE<br/>COMMIT<br/></div><br/><br/>開啟GRE以及1723，在filter區段加入以下兩行<br/><br/>-A INPUT -p gre -j ACCEPT<br/>-A INPUT -p tcp --dport 1723 -j ACCEPT<br/><br/>重啟防火牆即可。<br/>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?78</link>
<title><![CDATA[SSH 反向隧道與proxy]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[linux]]></category>
<pubDate>Wed, 03 Apr 2019 02:29:47 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?78</guid> 
<description>
<![CDATA[ 
	當家裡有一台linux 主機，而家中又是使用NAT，而分享器也不是你能夠控制的時候<br/><br/>當你人在外面，要連回去既不能設定DMZ也不能設定port forward，那要怎麼連回家中呢？<br/><br/>這時候就可以使用ssh的反向隧道<br/><br/>假設家中的伺服器A，這時候我們需要一台中繼用的伺服器B<br/><br/>B必須讓A能夠ssh連線，同時也要讓我們在想要控制A的地方能夠連線<br/><br/>連線方式是從A發起ssh連線到B，並設定反向隧道<br/><br/>ssh -fN -R 反向隧道的port:localhost:22 username@B_ip<br/><br/>接著當我們想要連回A的時候，先ssh登陸B，接著走這條反向隧道<br/><br/>ssh username@localhost:反向隧道的port<br/><br/>就可以連線回A了。<br/><br/>當要中斷這個服務的時候，因為是B在LISTEN這個PORT<br/><br/>所以在B上用netstat找到這個PORT的PID，kill掉就可以了。<br/><br/>這種方式是需要先登錄到B主機，也有另一種方式直接在B主機上開一個PORT LISTEN，做到直接轉發<br/><br/>首先修改SSHD的設定<br/><br/>vim /etc/ssh/sshd_config<br/><br/>找到GatewayPorts，把註解拿掉並加上clientspecified，重啟sshd<br/><br/>service sshd restart<br/><br/>從A建立反向連線<br/><br/>ssh -fN -R B_IP:B轉發PORT:localhost:22 B_user@B_IP<br/><br/>如果是RDP的話要改成localhost:3389<br/><br/>這樣以後只要ssh B_user@B_IP:B_PORT就可以直接連線回A了。<br/><br/>另外我們還可以利用這條連線讓其他服務進行存取，原理是這樣的<br/><br/>首先在使用自己電腦連上B的轉發PORT，在windows上你可以使用putty<br/><br/>或是有支援ssh的話(windows 10應該有支援)直接這樣下<br/><br/>ssh -D 8080 user@B_IP -p B轉發port&nbsp;&nbsp;# 8080是自訂的一個隨意的PORT<br/><br/>如果不支援ssh的話就下載putty或是pietty用putty mode<br/><br/>在host跟port的地方設定你要當作跳板的server資訊，接著點左方ssh的tunnel<br/><br/><a href="https://xdeath.tw/attachment.php?fid=10" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=10" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>接著再source那邊填入你要當作跳板的port，選擇dynamic->add<br/><br/><a href="https://xdeath.tw/attachment.php?fid=11" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=11" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>open之後打入帳號密碼登入就可以了<br/><br/>等等我們要讓其他服務的流量通過8080這個PORT到B再到A<br/><br/>保持這個連線的視窗不要關掉，接著到IE的工具->網際網路選項<br/><br/>選擇連線->lan設定，勾起自動偵測設定，以及為您的LAN使用PROXY<br/><br/>進入進階Socks，位址打上localhost，連接埠打上剛剛的8080<br/><br/>確定後測試一下，你連線網頁是不是先到B再到A再到你要瀏覽的網頁<br/><br/>直接用瀏覽器連http://ifconfig.me，如果看到自己的IP是A的IP那就表示成功了。<br/><br/>另外一種情境是防火牆內有一台windows的機器以及一台linux的機器<br/><br/>但是你只能夠連的到linux，需要透過linux對windows進行遠端，若是windows10本身內建ssh client<br/><br/>可以用以下的指令到linux建立tunnel讓你遠端windows<br/><br/>ssh -L 3390:windows_ip:3389 -l username linux_ip<br/><br/>然後再用windows內建的rdp軟體去連線localhost:3390就走tunnel到linux的3390<br/><br/>再繞到windows的3389 port，完成遠端桌面作業。
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?77</link>
<title><![CDATA[rclone - 用command line存取各種雲端硬碟]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[linux]]></category>
<pubDate>Fri, 15 Mar 2019 07:01:25 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?77</guid> 
<description>
<![CDATA[ 
	會想到再linux上同步資料到google drive或是dropbox主要是有些比較重要的資料<br/><br/>加密之後放在公有雲上還是比放在自己的NAS之類的上面安全(至少不用維護)<br/><br/>畢竟有時候自己的檔案伺服器會碰到停電、斷網，甚至硬碟故障的問題才衍生出這個需求<br/>rclone是一套公開的軟體，支援的雲端硬碟非常多，我先用centos 7做範例<br/><br/>首先到官網直接<a href="https://rclone.org/downloads/" target="_blank">下載</a>相對應的rclone <br/><br/>下載後直接解壓縮，unzip 後裡面最主要就一個執行檔而已先測試一下你的版本對不對<br/><br/><div class="code"><br/>./rclone --version<br/>rclone v1.46- os/arch: linux/amd64- <br/>go version: go1.11.5<br/></div><br/>看起來沒錯，接下來進行設定，(以下建議找一台WINDOWS下載rclone後進行設定)<br/><div class="code"><br/>rclone config<br/>n) New remote<br/>s) Set configuration password<br/>q) Quit config<br/>n/s/q&gt; n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #新建一個連線<br/>name&gt; test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#連線名稱<br/> 1 / A stackable unification remote, which can appear to merge the contents of several remotes<br/>&nbsp;&nbsp; &#92; &quot;union&quot;<br/> 2 / Alias for a existing remote<br/>&nbsp;&nbsp; &#92; &quot;alias&quot;<br/> 3 / Amazon Drive<br/>&nbsp;&nbsp; &#92; &quot;amazon cloud drive&quot;<br/> 4 / Amazon S3 Compliant Storage Provider (AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, etc)<br/>&nbsp;&nbsp; &#92; &quot;s3&quot;<br/> 5 / Backblaze B2<br/>&nbsp;&nbsp; &#92; &quot;b2&quot;<br/> 6 / Box<br/>&nbsp;&nbsp; &#92; &quot;box&quot;<br/>.....<br/>Edit advanced config? (y/n)<br/>y) Yes<br/>n) No<br/>y/n&gt; n<br/>Remote config<br/>Use auto config?<br/> * Say Y if not sure<br/> * Say N if you are working on a remote or headless machine<br/>y) Yes<br/>n) No<br/>y/n&gt; y<br/></div><br/><br/>我先用google drive做DEMO，選擇12，接著就一路enter，中間問你要給什麼樣的權限<br/><br/>接著是是否要進階設定，結束後會開啟瀏覽器讓你登入google帳號，點允許rclone權限<br/><br/><div class="code"><br/>If your browser doesn&#039;t open automatically go to the following link: http://127.0.0.1:53682/auth<br/>Log in and authorize rclone for access<br/>Waiting for code...<br/>Got code<br/>Configure this as a team drive?<br/>y) Yes<br/>n) No<br/>y/n&gt; y<br/></div><br/><br/>接著底下就是一個設定檔<br/><br/>[test]<br/>type = drive<br/>scope = drive.readonly<br/>token = &#123;"access_token":"xxx","token_type":"Bearer","refresh_token":"xxx","expiry":"2019-03-15T15:42:23.301164+08:00"&#125;<br/><br/>結束設定，把這段config複製到linux上的/root/.config/rclone/rclone.conf<br/><br/>接下來就可以直接操作了，以下列出一些比較簡單常用的指令<br/><br/>rclone ls --max-depth 1 test:/&nbsp;&nbsp; #列出第一層的檔案<br/><br/>./rclone copy -v 測試上傳 test:/測試上傳&nbsp;&nbsp; #上傳<br/><br/>./rclone copy -v:/測試下載 ./&nbsp;&nbsp; #下載<br/><br/>接下來只要搭配cronjob就可以定時的把一些重要資料送到公有雲上了
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?76</link>
<title><![CDATA[python web api]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Mon, 11 Mar 2019 02:48:26 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?76</guid> 
<description>
<![CDATA[ 
	首先安裝flask套件<br/><br/>pip install flask<br/><br/>用flask模擬一個5000 PORT的web server<br/><br/><div class="code"><br/>from flask import abort<br/>from flask import Flask, jsonify, request<br/>app = Flask(__name__)<br/><br/>@app.route(&#039;/&#039;, methods=&#91;&#039;GET&#039;&#93;)<br/>def hello():<br/>&nbsp;&nbsp;&nbsp;&nbsp;return &#039;hello world!&#039;<br/>if __name__ == &#039;__main__&#039;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;app.run(host=&#039;0.0.0.0&#039;, port=5000 ,debug=True)&nbsp;&nbsp;#host=0.0.0.0就是開放所有人連線,127.0.0.1就是只接受本機連線<br/></div><br/><br/>接下來用瀏覽器去連http://ip:5000，就會看到hello world!<br/><br/>一個頁面大概像下面這樣，method有POST、GET、PUT、DELETE<br/><br/>我比較常用的就是POST跟GET為主<br/><div class="code"><br/>@app.route(路徑,methods=&#91;&#039;GET&#039;,&#039;POST&#039;&#93;)&nbsp;&nbsp;#路徑,允許的方法<br/>def function():<br/>&nbsp;&nbsp;&nbsp;&nbsp;要做的動作<br/>&nbsp;&nbsp;&nbsp;&nbsp;return &#039;要回傳的值&#039;<br/></div><br/><br/>那POST要怎麼接收值呢，其實就是用request.form<br/><br/>假設我們要接收一個datetime的參數<br/><div class="code"><br/>@app.route(&#039;/post&#039;,methods&#91;&#039;POST&#039;&#93;)<br/>def function():<br/>&nbsp;&nbsp;&nbsp;&nbsp;datetime = request.form&#91;&#039;datetime&#039;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return &#039;要回傳的值&#039;<br/></div><br/><br/>比較麻煩的是如果使用者丟上來的參數沒有datetime，程式就會出錯<br/><br/>所以如果這是必要欄位建議還是用try去接收<br/><br/><div class="code"><br/>@app.route(&#039;/post&#039;,methods&#91;&#039;POST&#039;&#93;)<br/>def function():<br/>&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datetime = request.form&#91;&#039;datetime&#039;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;except:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#039;error&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return &#039;要回傳的值&#039;<br/></div><br/><br/>如果是GET<br/><br/><div class="code"><br/>@app.route(&#039;/test/&#039;,methods=&#91;&#039;GET&#039;&#93;)<br/>def get_task():<br/>&nbsp;&nbsp;&nbsp;&nbsp;return request.args.get(&quot;task_id&quot;)&nbsp;&nbsp; #直接取得參數<br/></div><br/><br/>用瀏覽器連http://ip:5000/test/?task_id=123，就會看到123<br/><br/>如果是希望在連線沒有這個URL的時候不要跳出DEBUG的錯誤訊息，而是404之類的話<br/><br/>就在前面加上<br/><br/><div class="code"><br/>@app.errorhandler(404)<br/>def not_found(error):<br/>&nbsp;&nbsp;&nbsp;&nbsp;return &#039;404&#039;<br/></div><br/><br/>要取得USER到底是用post、get、put、delete的話<br/><br/>request.method(注意取得的值是大寫的GET、POST...)<br/><br/>取得使用者的IP&nbsp;&nbsp;request.remote_addr<br/><br/>另外如果要設定timeout之類的話，很像單純只靠flask內建的web是做不到的<br/><br/>要搭配其他的module或是將執行的動作寫到另一個程式內<br/><br/>用os.popen去呼叫，並且在該程式使用multithread去計算是否有逾時<br/><br/>如果逾時則回覆504之類的...
]]>
</description>
</item>
</channel>
</rss>