Windows batch script:findstr來搜尋指定的字串並判斷成功的範例

 已經習慣在Linux中使用grep的指令來搜尋字串,而在Windows系統中,可以用指令findstr來搜尋字串

下面是一個範例,使用errorlevel這個環境變數來判斷findstr沒有沒有找到指字的字串,如果成功,則會傳回0

findstr /m "Export.terminated" db_exp.log
if %errorlevel%==0 (
echo "found"
) else (
echo "not found"   
)

上面的範例是我用來判斷Oracle DB在exp資料後產生的log文字檔,是否有成功。

因為空白會被分詞,例如「Export terminated」就會被拆成「Export」、「terminated」兩個字,

只要符合其中一個就可以,所以我加上萬用字符「.」,讓程式知道「Export」、「terminated」中間還有一個字。


ORA-01950: no privileges on tablespace 'XXXXX'

 今天在用這個schema:test01來新建Table時,出現了錯誤的訊息:
ORA-01950: no privileges on tablespace 'USER_1'

依照訊息所示,應該是權限不足,但是我早已經把Create Table的權限授予test01。

經一番查詢後,最後發現是沒有設定Tablespace的配額給test01,於是執行下列的指令後,再新建Table就成功了。
SQL> alter user test01 quota unlimited on USER_1;

會產生這個問題主要在於我於第一次新建Tablespace:USER_1時,是以test02來建立並已在Create TABLESPACE時已經有設定配額了。

但是後來單獨建立test01,並將Default Tablespace指定給test01,所以預設對tablespace是沒有配額的。

查詢Tablespace的配額情況:
SQL> select * from dba_ts_quotas

其中的欄位MAX_BYTES的值如果是-1,表示是unlimited


在Windows中刪除Oracle的Session

 使用者通知在Oracle DB的測試機中,有一支HR的客製程式一直跑不出來,所以把它刪掉。

首先用SQL來找出該程式的SID、SERIAL、SPID等訊息:

SQL> select vs.sid,vs.serial#,vp.spid,vs.*,vp.* from v$session vs,v$process vp where vp.addr=vs.paddr;

找到的SID:519、SERIAL:17202、SPID:23903,先在DB將其Session刪掉:

SQL> alter system kill '519,17202';

觀察刪除Session的狀態,一直處在KILLED,如果是UNIX的系統,可以下達指令kill -9 23903來刪除,這樣就可以了。

但是這次案例中,系統是Windows,用資源管理器或工作管理員是找不到SPID:23903


與UNIX的進程(thread)管理不同,Windows是基於線程(process)管理的作業系統,所以呈現的是process id。

因為是process,所以全都包含在ORACLE.EXE,如果刪除這個Process,會把Oracle背景程式等一併刪掉,將導致Oracle DB整個當掉。

為此Oracle DB預設有提供一個專為Windows操作的指令:orakill,利用這個Oracle的指令,可以安全地將相應的thread刪掉。

orakill的語法如右:orakill <SID> <THREAD ID>

<SID>就是Oracle的SID;<THREAD ID>指的就是Oracle的SPID,所以在此案例中,我們可以用下列指令來刪除Windows的thread

C:> orakill 519 23903

需要注意的是,如果你Kill掉的是Oracle的背景程式(DBWR、LGWR、SMON、PMON等),將導致Oracle當掉,檢查Oracle的背景程式的SQL如下:

SQL> select vs.sid,vs.serial#,vp.spid,vb.name,vp.program
             from  v$session vs, v$process vp, v$bgprocess vb
             where vb.paddr = vp.addr 
             and vp.addr = vs.paddr
             and vb.paddr <> '00';

進程Process:

就是載入記憶體且執行的program。Process是作業系統分配資源(CPU Time、Memory…等)的最小單位。


線程Thread:

Thread可以想像成存在於 process 裡面,所以一個Porcess會有至少一個或多個Thread。

Thread 是作業系統能夠進行運算排程的最小單位,實際執行任務的並不是進程,而是進程中的線程,

一個進程有可能有多個線程,而多個線程可以共用進程的系統資源,Process就像一個工廠,有許多的機器,而線程則工人,負責操作執行。




修改 Ubuntu 20.04 系統時區

 我用Hyper-V安裝一台Ubuntu 20.04,安裝完成後先來改一下系統時區,記錄一下我的步驟。

一、檢查當前時區

方法1:使用 timedatectl 命令
$ timedatectl



方法2:查詢/etc/localtime的連結
$ ls -l /etc/localtime


方法3: 查看 /etc/timezome 內容
               $ cat /etc/timezone


二、修改時區

透過指令來查看時區的名稱
$ timedatectl list-timezones


因為我們在臺灣,以timedatectl來設定Asia/Taipei
$ sudo timedatectl set-timezone Asia/Taipei


三、利用上述步驟一的三種方法來確認修改結果

使用 timedatectl 指令確認
$ timedatectl






解決Internet Explorer防止跨網站指令碼攻擊

 由於ERP是比較舊的系統,今天在登入時出現「Internet Explorer已修改這各網頁以協助防止跨網站指令碼攻擊」,如下圖


雖然我已經將ERP的IP加入信任網域,但是有時候還是會出現上面的訊息,其解決的方式是到「網際網路選項」


找到「XSS篩選器」並將其停用即可解決




 因為想要遠端管理另一台目標Windows Server,雖然可以使用RDP,但是想以Script來自動管理則可以用powershell。


首先以系統管理員的身份執行powershell

檢查兩台Windows是否已啟用winrm(Windows Remote Management)

C:/> get-service winrm


啟用與停用winrm

C:/> start-service winrm

C:/> stop-service winrm


確認已啟用winrm之後,在Server端進行快速config來允許Client可以遠端連線

C:/> winrm quickconfig


以本機來來測試是否可以連線成功

C:/> enter-pssession localhost


如果沒有加入網域,則在Client端把Server(192.168.1.182)加入信任清單

C:/> set-item wsman:\localhost\client\trustedhosts "192.168.1.182"


查詢信任清單

C:/> get-item wsman:\localhost\client\trustedhosts



在Client端設定登入Server的帳號及密碼,例如username:test01,password:123456

$s_passwd = ConvertTo-SecureString "123456" -AsPlainText -Force;

$cret = New-Object System.Management.Automation.PSCredential("test01",$s_passwd);


連線Server

C:/> enter-pssession  -Computer 192.168.1.182 -Credential $cret


連線成功後就可以利用Powsershell指令來操作Server端


Win 10 開啟網頁時出現此網站的連線不安全

今天連線一個不常開啟的伺服器管理網站,之前是正常的,可是這次卻出現了「此網站的連線不安全」,內容大是說使用不支援的通訊協定。


查詢後,有可能是更新後不支援舊的TLS協定,可以下列方式手動啟動。

進入控制台,選擇「網際網路選項」,再到進階內將舊的TLS協定啟用後,重新登入網頁就可以成功了。