利用Plink替代Putty來建立Script

以往都是用putty這套好用的小程式來連接Server並撰寫Script來自動執行指令。

我的Script資料夾中有一個免安裝的putty,並設定好Session:test01,所以Script有一行指令:putty.exe -load test01。

直到前幾天因為某些原因,重設了另一個資料夾下putty的Session,結果發現原本設定好的test01也不見了。

經查文件後,我才知道putty的設定是放在windows的registery裡面,所以所有的putty都會共用這些設定。


後來在putty的document中發現putty有建議用另一個command line tool:plink來建立script,並提供了許多參數的說明。

document:https://the.earth.li/~sgtatham/putty/0.76/htmldoc/


所以我依文件改寫了scirpt,如下:

plink.exe -ssh -l tt01 -i private.key -batch 192.168.199.126  replication status all


記錄一下我自己的說明:

-ssh:使用ssh協定

-l:指定帳號

-i:private key,我用這個來取代密碼

-batch:取消所有交談提示

192.168.199.126:Server IP

replication status all:連上Server後要執行的指令


詳細的參數說明可以直接下plink或參考document

設定Windows Service(服務)的相依性

解決了上一篇服務啟動會逾時的問題之後,又出現了一個新的問題,那就是服務的啟動順序。

因為正式區的速度快,所以並沒有發生問題,但是測試區因為速度慢,問題就出現了。

問題如左:我們的DB與AP在一台,而AP需要等到DB啟動完成後才能啟動,不然會因為找不到DB而掛掉。

而當初正式區的AP、DB安裝完後,重新開機並沒有發生問題,所以就沒有設定相依性。

設定相依性可依下列的方式進行:

1、執行regedit進入登錄編輯程式

2、找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\選擇所要設定的Service

3、新增類別為[多字串值],名稱為DependOnService的機碼

4、機碼的值則填入欲相依的Service名稱(DisplayName),可輸入多個Service,表示這些都要先啟動完成

5、重新啟動相依的服務,是否會先被終止再啟動。如果沒有生效,可以重開機試試。



可以查看服務的相依性,應該就會出現了。




Windows Service(服務)無法自動啟動,出現逾時的錯誤

 我們有一台顧問幫忙裝好的HR系統,今天在做異機還原測試時,發生了系統開機後,相關服務沒有自動啟動。

於是我們先以手動的方式測試是否還原有問題,測試的結果手動啟動服務沒有問題。

檢查Windows的事件,發現有逾時的錯誤


原來Windows的服務有預設30秒的限制,在該限制秒數之內如果還沒有得到成功的回應,那該服務還是會被停掉,而我們這台還原測試的機器,硬體規格與正式區差異很大,所以開機的速度相當緩慢。

依據微軟的技術文件,將逾時的值改為120秒後,問題就解決了,需注意的是該方法會套用所有的服務。

執行的步驟如下:

1、啟動登錄編輯程式 (Regedit.exe) 。

2、找到登錄機碼: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

3、以滑鼠右鍵按一下 [ ServicesPipeTimeout ] DWORD 值,然後按一下 [ 修改]。

4、按一下 [ 十進位]。

5、輸入 60000(毫秒),然後按一下 [確定]。

如果沒有 [ ServicesPipeTimeout ] ,可依下列新增:

1、找到登錄機碼: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

2、在 [編輯]  -->  [新增],然後按一下 [DWORD 值]。

3、輸入名稱 ServicesPipeTimeout,然後按下確定

4、與上述的方式一樣,將值修改為 60000(毫秒)即可。





Oracle DB: ORA-12638: Credential retrieval failed

 今天新增了一台Windows平台的Oracle DB 19c,本機連線Oracle DB是沒有問題,DB也確認一切都正常運行。

在以我的Win 10筆電以SQL*Plus要連上這台DB時,出現了下列的錯誤:

ORA-12638: Credential retrieval failed

以指令tnsping測試DB是ok的:


其原因在於我的筆電中sqlnet.ora的一個設定值:

    SQLNET.AUTHENTICATION_SERVICES= (NTS)

將其值改為如下,就可以成功連線DB了:

    SQLNET.AUTHENTICATION_SERVICES= (NONE)

對於Windows平台,SQLNET.AUTHENTICATION_SERVICES = (NTS)會開啟作業系統認證登入,而不是用Oracle DB的帳號認證

在Windows中,是通過sqlnet.ora來實現驗證機制,而且其默認的預設值是NTS

下列是幾種情況:

1、sqlnet.ora是空的,或是用#注解 : 基於Oracle密碼文件驗證

2、SQLNET.AUTHENTICATION_SERVICES = (NTS) : 基於作業系統驗證

3、SQLNET.AUTHENTICATION_SERVICES = (NONE):基於Oracle密碼文件驗證

4、SQLNET.AUTHENTICATION_SERVICES = (NONE,NTS):基於作業系統驗證




nginx+uwsgi+flask:CORS跨網域錯誤解決

 我有一個以nginx+uwsgi+flask架設的Web API服務,但是在網頁呼叫該API時,瀏覽器出現了CORS跨網域錯誤。

這是瀏覽器為了安全性而設置的規則,我找到兩個方案:一個以flask來設置;另一個以nginx來設定。


flask方案(因為我用nginx架設服務,所以我不確定該方式是否有效的):

1、安裝 flask_cors 套件:pip install flask_cors  

2、程式如下:  

    from flask import Flask  

    from flask_cors import CORS  

    app = Flask(__name__)  

    CORS(app)    

    @app.route("/")  

    def helloWorld():  

        return "Hello!"  


nginx方案(我用此方案):

在設定檔nginx.conf的每個區段加入下列語法:

    add_header Access-Control-Allow-Origin *;  

    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';  

    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';  

程式範例如下:  

location /ft-prtg {

        add_header Access-Control-Allow-Origin *;

        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';

        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

        default_type "text/html";

        alias /test/html/test_FT.html;

    } 


重啟nginx之後,在瀏覽器的開發工具檢示其結果如下,已加在Header上了。




python flask print to console

 因為在使用flask開發時,總是會有除錯的時候,所以需要把一些訊息print出來。

在python 2的版本,可以使用下列的方式:

from __future__ import print_function

import sys

print('This is test1', file=sys.stderr)

print('This is test2', file=sys.stdout)


而在python 3的版本下,已經不需要print_function,改為如下:

import sys

print('This is test1', file=sys.stderr)

print('This is test2', file=sys.stdout)

docker container測試flask,無法於外部Host瀏覽

 我用Docker來測試及學習Flask,container有將Port mapping:5000:5000

test.py的內容如下,是一段簡單的程式:

from flask import Flask

app = Flask(__name__)

@app.route("/")

def hello_world():

    return "<p>Hello, World!</p>"

if __name__ == "__main__":

    app.run(debug=True, host='0.0.0.0', port=5000)

因為在討論區上有人提到flask預設會只能使用localhost,所以我有加上host='0.0.0.0'

接著我執行下列的指令來啟動Web Server:

# export FLASK_APP=test

# flask run


在docker container用crul http://127.0.0.1:5000來測試,有正確出現Hello,World的訊息。

但是在Host端用瀏覽器開啟http://192.168.1.1:5000(192.168.1.1是Host的IP)卻無法顯示網頁。


接著在討論區上又看到有人提到新版本要以python加參數來啟動flask,所以我依樣輸入下列指令:

# export FLASK_APP=test

# python3 -m flask run --host='0.0.0.0'


再次以瀏覽器開啟http://192.168.1.1:5000,這次就正確出現Hello,World

利用Plink替代Putty來建立Script