顯示具有 Linux 標籤的文章。 顯示所有文章
顯示具有 Linux 標籤的文章。 顯示所有文章

修改 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






Linux把登入的使用者強制退出

 有時候在管理Linux時,會想知道目前系統中有多少的登入者,使用who指令:

$ who
test3    tty1         2022-03-07 01:36
test2    pts/0        2022-03-08 05:15 (192.168.137.1)
test1    pts/1        2022-03-08 08:24 (192.168.137.1)

如果想知道比較詳細的訊息,可用指令w

$ w
08:24:37 up 1 day,  6:50,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
test3    tty1     -                Mon01   30:47m  0.05s  0.03s -bash
test2    pts/0    192.168.137.1    05:15   31:43   0.62s  0.03s sshd: test [priv]
test1  pts/1    192.168.137.1    08:24    1.00s  2.14s  0.00s w

如果想踢掉最後一個,以root權限時執行下列指令:
# pkill -kill -t pts/1

就可以把test1給踢掉。

curl測試時出現:no route to host

 我有一台VPS的Ubuntu主機,用nginx架設了一個測試用的網頁服務。

原本使用上都沒有問題,在關閉服務約一個月後,今天重新啟動,卻再也連不上了,出現了no route to host

我先用curl http://127.0.0.1來測試,結果正常傳回首頁,這表示http service是沒有問題的。

接著我確認了DNS的設定與VPS的安全性設定,結果也都是正常的。

檢查防火牆的設定,結果是關閉的

ubuntu@vps1:~$ sudo ufw status
Status: inactive

最後依網路文件,將iptables設定完成後就可以了,未來有機會再好好研究看看,目前測試網頁沒問題就好了。

可以通過將所有的默認策略設置為ACCEPT並刷新規則來disable(或停止)防火牆。

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F





Centos 7.9離線安裝Docker

 今天將Docker裝好了,記錄一下,以免之後又忘了

1、下載container-selinux-2.9-4.el7.noarch.rpm、docker-ce-17.12.0.ce-1.el7.centos.x86_64.rpm並上傳到伺服器

2、執行安裝,因為有依賴性問題,所以要注意這個package要先安裝

# yum localinstall -y container-selinux-2.9-4.el7.noarch.rpm

3、再安裝下一個package

# yum localinstall -y docker-ce-17.12.0.ce-1.el7.centos.x86_64.rpm

5、啟動Docker服務

# systemctl  start  docker

6、下載一個示範image來驗證是否正常

# docker run hello-world

Node.js Response 中文亂碼

 今天在測試node.js時,response出來的中文變成亂碼,在網路上找了一些文件及自己最後解決方式,記錄一下。


我的情形是這樣的,我在Windows上的docker有跑一個node.js,中文顯示是正常的;我在Cloud上跑的node.js,中文顯示是亂碼。但是程式碼內容是一樣的。

Cloud上安裝是Debian GNU/Linux 9 (stretch)


網路上有提到文件需要是utf-8的格式,所以我在Cloud上檢查我的app.js檔:

# file -i app.js

app.js: text/plain; charset=utf-8

文件是utf-8,內容也是utf-8,所以原則上應該是沒有問題的。


另一個需要注意的是header,所以我在app.js上加上下列:

res.header("Content-Type", "application/json; charset=utf-8");

但是response的中文還是亂碼,最後發現是我的ssh client的問題。


因為Cloud上沒有辦法輸入中文,所以我是先在Windows的vs code編輯好後再複製程式碼貼到Cloud上。

我使用的是xshell來連線Cloud,需要在「檔案」->「內容」,找到「終端機」的設定頁,將編碼改為UTF-8

這樣貼上程式碼時才會是UTF-8,重啟cloud上的node.js後中文就可以正常顯示了。

Raspberry Pi 開機自動執行python程式

 我有自行開發的一支網頁監控程式,需要在樹莓派上啟用python3的http服務。

參考網路上的作法在init.d設定新的daemon沒有成功,手動測試啟動時會出現下列錯誤:

Failed to start prtg.service: Unit not found.

Raspberry Pi的OS版本如下:

pi@raspberrypi:~ $ cat /etc/os-release

PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"

經查詢之過才知道OS已將sysvinit改為systemd,依步驟設定好systemd之後終於可以開機自啟動。

1、在程式server_pi.py的第一行加入 #!/usr/bin/python3,並付予執行的權限

# sudo chmod +x server_pi.py

2、在/lib/systemd/system/新增檔案prtg,並將下列內容加入:

[Unit]

Description=Prtg Python Server


[Service]

Type=simple

ExecStart=/home/pi/Desktop/prtg_monitor_fh/Server/app/server_pi.py

Restart=always


[Install]

WantedBy=multi-user.target

3、設定開機時自動啟動

# sudo systemctl enable prtg

4、測試是否可以正確啟動

# sudo systemctl start prtg

5、可以查詢service的狀況

# sudo systemctl status prtg

6、重開樹莓派看看是否開機可以自動啟動


樹莓派Raspberry Pi關閉休眠、螢幕長亮

 記錄一下同事找到的作法,以備日後有需要時可以參考。

# cd /etc/lightdm

# vi lightdm.conf

找到xserver-command並將註解拿掉,其值改為如下:

xserver-command=X -s 0 -dpms

其中 -s # 設置螢幕保護不啟用

dpms 關閉電源節能管理

重開樹莓派即可。

還有另一種方式就是安裝 xscreensaver 套件

# sudo apt-get install xscreensaver

在X window的畫面左上點擊樹莓派icon > 偏好設定 > 螢幕保護程式

將 Mode 改為 Disable Screen Saver


Linux。讓alias支援輸入參數



alias別名指令是無法支援參數的輸入,例如下列的設定是無效的,會產生錯誤:
alias rm='cd $1'

但是可以利用自訂函數的方式讓alias支援參數,範例程式如下,當使用者輸入cd /bin時,執行函數checkdir並帶入參數/bin:
alias cd='checkdir'
function checkdir() {
    ldir=`pwd`
    if [ $1 == ".." ] && [ $ldir == "/export/home/test" ]
        then
          echo "Limit command"
        else
          #builtin cd /export/home/test/$1
          /export/home/test/bin/ cd /export/home/test/$1
        fi
}

Solaris、Linux刪除亂碼檔案

有時候會遇到使用者上傳中文檔名的檔案,但是系統並未安裝中文語系時,其檔案名稱會變成亂碼。
亂碼檔名讓我無法更名、刪除,因為系統會回覆找不到檔名,此時可利用檔案號碼來處理。

一、先用 ls -i 找出檔案號碼
# ls -i OMF555*
258337 OMF553_??????-).fmb

二、利用檔案號碼刪除檔案,find 的參數 -inum <FILE_NUMBER> 可以找出指定號碼的檔案
# find . -inum 258337 -exec rm -i  {} \;

三、更名
find . -inum 258337 -exec mv {} OMF553_2.fmb \;

Solaris Shell Script將文字轉為數字

因為需要將文字轉為數字,以便相加,可用下列兩種方式:

1、expr
root@TEST# export a=03
root@TEST# export b=2
root@TEST# expr $a + $b
5
root@TEST# export a=030
root@TEST# expr $a + $b
32

2、echo $(( ? ))
root@TEST# export a=03
root@TEST# export b=2
root@TEST# echo $(( $a + $b ))
5
使用此方式時需要注意 010 並不等於數字 10,如下:
root@TEST# export a=030
root@TEST# echo $(( $a + $b ))
26

crontab 隔週執行程式

有一支排程backup.sh希望可以每兩週執行一次,但是Crontab並沒有隔週的參數選項。

網路上有文章提到可以用第幾週來判斷是否執行程式,分為下列兩種方式:

方式一,寫在script內
#!/bin/sh
v_ck=`date +%W`
v_run=`expr $v_ck % 2`

if [ $v_run = 1 ];
   then backup.sh
        exit 1
   fi
 
方式二,利用test指令來判斷
10 10 * * *  su - user | test $(( $( date +%W ) %2 )) -eq 1 && backup.sh


date +%W是指取得週數,例如:2017/10/19是今年的第42週
用週數除以2取餘數,可以得到0或1兩個數字,再來判斷是否為隔週

OS Watcher: 免費監控作業系統效能的Oracle小工具


下載:OSWatcher (Includes: [Video]) (Doc ID 301137.1) 或 這裡(版本:oswbb734.tar)
OS Watcher 是一個 UNIX shell 的集合腳本,可以定期利用Top、vmstat、iostat等作業系統指令來收集作業系統的效能資訊,以便分析性能問題。
OS Watcher包含了收集資料的OS Watcher Black Box(OSWbb) 與分析資料的OSWatcher Analyzer(OSWba),目前oswbb的壓縮包已含括了oswba。

Solaris一次刪除多個Process

在停用EBS測試機的AP Server時,總是要等好一會兒,相關的Process才會停止。
只是這是待會要Clone的測試機,其實也不必考慮Process的問題,但是要一個一個手動刪除也是很麻煩的。

因為AP Server啟動的Process都是以testmgr這個帳號執行的,所以找了一下方法,可以直接以帳號來刪除全部的Process
語法如下:
ps -ef | grep testmgr | awk '{print $2}' | xargs kill -9

其主要是以ps及grep找出testmgr的所有process,再以awk來篩選pid的資料,在第二個欄位,最後以xargs讀取資料並代入kill的參數中。

xargs 會從標準輸入中讀取資料,並以空白字元或換行作為分隔,將輸入的資料切割成多個字串,並將這些字串當成指令執行時的參數

CentOS 7 網路設定

以Virtualbox安裝了CentOS 7,但是開機之後,網路卻無法使用,先查看目前的狀態:
[root@localhost ~]# nmcli d
DEVICE      TYPE      STATE         CONNECTION
docker0     bridge      connected     docker0  
virbr0        bridge       connected     virbr0    
enp0s3      ethernet    disconnected  --    
virbr0-nic  tap           connected     virbr0-nic
enp0s8      ethernet    disconnected  --        
lo               loopback  unmanaged     --

查看之後,有兩個網卡enp0s3、enp0s8,不過state是disconnected

查詢網路的設定檔內容,其中ONBOOT=no,未於開機時自動啟用
[root@localhost network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s8
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=4c902474-f51e-4a7d-b1ee-f9752ad3c298
DEVICE=enp0s8
ONBOOT=no
DHCPV6C=yes
PEERDNS=yes
PEERROUTES=yes

除了直接改設定檔之外,還可以用nmtui來修改:
[root@localhost ~]# nmtui


選擇<Edit...>


將「Automatically connect」勾選,自動連接


這次是以DHCP來取得IP,其實也可以指定IP的位置,在IPv4 CONFIGURATION的右邊點選Show,就有更詳細的設定如下圖:


重新啟用網路,就成功了。
[root@localhost ~]# systemctl restart network

CentOS 7 設定Grub2密碼保護

在版本1.98之後,GRUB2支持設定開機密碼了,也就是必須通過密碼驗證才能編輯Grub2開機選單的內容。

1、設定加密後的密碼
[root@localhost ~]# grub2-mkpasswd-pbkdf2
Enter password:
Reenter password:
PBKDF2 hash of your password is grub.pbkdf2.sha512.XXXXXXXXXX
把grub.pbkdf2.sha512.XXXXXXXXXX這一長串的密文複製或抄錄

2、編輯00_header,並加入帳號及密碼
[root@localhost ~]# vi /etc/grub.d/00_header
於檔案最後面加入以下內容,USERNAME即是帳號,密碼則是步驟1記錄下來的密文:
cat << EOF
set superusers="USERNAME"
password_pbkdf2 USERNAME grub.pbkdf2.sha512.XXXXXXXXXX
EOF

3、重新編譯grub.cfg
[root@localhost ~]# grub2-mkconfig --output=/boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-4ef980ac7daf470a87bcf366b2adeda4
Found initrd image: /boot/initramfs-0-rescue-4ef980ac7daf470a87bcf366b2adeda4.img

4、重開機之後,在Grub2的開機選單畫面中,要按e或c進入Grub的編輯模式時,會要求輸入帳號及密碼。



按e或c進入Grub的編輯模式時,會要求輸入帳號及密碼。


CentOS 7 Network is unreachable

因為我是以VirtualBox來安裝CentOS 7,在安裝時網路的部份選擇DHCP。

完成安裝之後,以ifconfig -a來查看網路的設定,結果如下圖,沒有看到IP。



試著ping 8.8.8.8時,果然也是ping不到:
# ping 8.8.8.8
connect: Network is unreachable

重開機後狀況也是一樣,查詢之後用指令dhclient來與DHCP連線,這次就成功了
# dhclient
# ifconfig -a



CentOS 7 修改語系與鍵盤配置

Change The System Language and Keyboard Layout.

因為安裝時選擇了繁體中文語系,但是沒有選擇任何的GUI介面,所以只有命令列模式可用。
使用命令列模式對學習Linux其實比較有幫助,不過會因為中文語系的緣故,訊息可能會有亂碼的產生。

查詢目前預設的System Language and Keyboard Layout.
[root@local ~]# localectl
   System Locale: LANG=zh_TW.UTF-8
   VC Keymap: cn
   X11 Layout: cn
   X11 Model: pc105+inet
   X11 Options: terminate:ctrl_alt_bksp

列出所有支援的locales
[root@local ~]# localectl list-locales
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER.utf8
aa_ER.utf8@saaho
aa_ER@saaho
...

查詢所以的keymap
[root@local ~]# localectl list-keymaps
ANSI-dvorak
amiga-de
amiga-us
applkey
at
...

更改locale,改成英文語系
[root@local ~]# localectl set-locale LANG=en_US.UTF-8

更改鍵盤配置
[root@local ~]# localectl set-keymap us

再查詢一次
[root@local ~]# localectl
   System Locale: LANG=en_US.UTF-8
   VC Keymap: us
   X11 Layout: us
   X11 Model: pc105+inet
   X11 Options: terminate:ctrl_alt_bksp
 
重開機後就解決了。

Linux grep找出前一行、後一行的字串

Linux的grep有參數-B、-A,可以取出符合搜尋條件行的前、後行字串。

例如:
[ly@oel6 ~]$ cat test.txt
abc
def
hij

取出後一行
[ly@oel6 ~]$ grep "d" -A1 test.txt
def
hij

取出前一行
[ly@oel6 ~]$ grep "d" -B1 test.txt
abc
def

取出前、後各一行
[ly@oel6 ~]$ grep "d" -A1 -B1 test.txt
abc
def
hij

在Linux上安裝嘸蝦米輸入法(gcin)

首先當然是安裝gcin中文輸入程式,gcin內訂有嘸蝦米輸入法,
但是因為嘸蝦米是需要收費的,所以沒有相應的table可以使用。
# rpm -ivh  gcin-1.5.1-1.el6.x86_64.rpm

接著就是要去下載嘸蝦米的表格檔,假設下載的檔名為liu5.cin

把表格檔放到Linux上,把Big5轉為UTF-8碼
# iconv -f big5 -t utf-8 liu5.cin > liu5u.cin

產生gcin專用的表格檔
# gcin2tab liu5u.cin

將表格檔複製到gcin的資料夾下
# cp liu5.gtab /usr/share/gcin/table

編輯gtab.list
# vi /usr/share/gcin/table/gtab.list

找到gcin已經留好的嘸蝦米的欄位,把檔名改為liu5u.gtab如下:
嘸蝦米  9  liu5u.gtab

記得需要登出再登入。

如果是行易公司的會員,則可以到官網直接下載專為gcin設計的腳本檔。


讓遠端的Xwindow server可以使用中文輸入法

因為上網找資料,結果win7的電腦中毒,在用TrueImage還原系統備份檔之後,
對windows系統的安全不太放心,但是有時又有需要上網找尋解決辦法,
所以就想以Linux來上網好了,不過因為有些開發程式需要Winodws的系統,
所以又不能放棄掉Windows系統,就把Linux安裝在virtualBox虛擬機器上面,
透過Xwindow Server利用Linux上網,這樣應該會比較安全吧。
這樣的方式之前已經試過多次,設定xwindow server上沒有什麼問題,
不過遠端控制的firefox沒有辦法輸入中文,倒是蠻傷腦筋的。

在google的幫助之下,找到gcin這個中文輸入有支援遠端輸入的功能,
下面是我依網路的方法設定成功的步驟:

我在虛擬機上安裝的是Oracle Linux 6.2,因為手邊剛好有它的ISO,
Oracle Linux與Redhat Linux是一樣的核心,也都是使用rpm管理套件,
所以應該也適用Redha的Linux。

首先先到網路上下載相應Linux版本的gcin rpm,因為我的是OEL 6,
所以下載的是gcin-1.5.1-1.el6.x86_64.rpm。

安裝gcin
# rpm -ivh gcin-1.5.1-1.el6.x86_64.rpm

開啟gcin的設定檔

因為切換輸入法的預設是Ctrl+Space,與Windows一樣,
所以把它改為Shift+Space。
最重要的要把「port 9999-」這個選項勾選起來。

接著在win7安裝xwindows server的程式,我用的是xming,
並把xwindows server啟動。

回到Linux,修改.bash_profile的設定:
# vi ~/.bash_profile

在.bash_profile的最後面加入下面兩行語法:
export GTK_IM_MODULE=gcin
export QT_IM_MODULE=gcin

第一次加入語法後需要手動啟用,之後只要登入就會執行了。
# . ~/.bash_profile

最後就設定DISPLAY變數,指定Win7的IP,並開啟firefox
# export DISPLAY=192.168.56.111:0.0
# firefox

此時win7就會出firefox瀏覽器,按下shift+space就可以輸入中文。



AI創作實驗紀錄