∮Ω奧米加空間∮»技術文件區»Linux 筆記
| 作者 |
主題 分頁:[ 1 2 3 4 5 ] |
dc
管理員

性別:男
來自:瓦肯星
發表總數:11722
註冊時間:2002-05-07 16:32 |
(第 21 篇)
資料來源:软件开发程序员博客文章收藏网
如果需要週期性的紀錄 Linux CPU,Disk io 等等系統訊息的狀態可以使用 nmon
官方網站
http://nmon.sourceforge.net/pmwiki.php
執行步驟
wget http://sourceforge.net/projects/nmon/files/nmon_x86_64_centos6
chmod +x nmon_x86_64_centos6
./nmon_x86_64_centos6
依需要監看的資料輸入相對應的按鍵
Use these keys to toggle statistics on/off: x
x c = CPU l = CPU Long-term - = Faster screen updates x
x m = Memory j = Filesystems + = Slower screen updates x
x d = Disks n = Network V = Virtual Memory x
x r = Resource N = NFS v = Verbose hints x
x k = kernel t = Top-processes . = only busy disks/procs x
x h = more options q = Quit
nmon -s10 -c60 -f -m /home/
参数解释:
-s10 每 10 秒采集一次数据。
-c60 采集 60 次,即为采集十分钟的数据。
-f 生成的数据文件名中包含文件创建的时间。
-m 生成的数据文件的存放目录。
在 crontab 中增加一条记录:
0 0 * * * root nmon -s300 -c288 -f -m /home/ > /dev/null 2>&1
300*288=86400 秒,正好是一天的数据。
nmon 性能:分析 AIX 和 Linux 性能的免费工具:
http://www.ibm.com/developerworks/cn/aix/library/analyze_aix/index.html
nmon analyser —— 生成 AIX 性能报告的免费工具:
http://www.ibm.com/developerworks/cn/aix/library/nmon_analyser/index.html
https://www.ibm.com/developerworks/community/wikis/form/anonymous/api/wiki/61ad9cf2-c6a3-4d2c-b779-61ff0266d32a/page/b7fc61a1-eef9-4756-8028-6e687997f176/attachment/721e9797-b5fc-41d7-9b2f-5bd2aa2c8f7d/media/nmon_analyser_34a.zip
Your mind to my mind,
your thought to my thought |
| 發表時間:2015-05-15 10:49 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11722
註冊時間:2002-05-07 16:32 |
(第 22 篇)
iptables 範例
沒想到一直沒把他放上來@@
#!/bin/sh
#
# 假設 eth0 為 public ip
#
#指定絕對路徑參數
IPTABLES=/sbin/iptables
# clear all 清除 iptable 參數
#-F :清除所有的已訂定的規則;
#-X :殺掉所有使用者建立的 tables ;
#-Z :將所有的 chain 的計數與流量統計都歸零
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z
# localhost allow accept
# 本機的 lo 一定要開啟不然例如 php 使用 localhost 呼叫 mysql 連線走 lo 會不通
$IPTABLES -A INPUT -i lo -j ACCEPT
#Any accept 開啟連線不阻擋的 ip
$IPTABLES -A INPUT -i eth0 -p tcp -s 210.xxx.xxx.xxx -j ACCEPT
#snmp 開啟遠端 cacti 連線監控 snmp 的 public ip 例如 219.84.xxx.xxx
$IPTABLES -A INPUT -p udp -m udp -s 219.84.xxx.xxx --dport 161:162 -j ACCEPT
#dns 開啟對外 dns 查詢 port 53
$IPTABLES -A INPUT -i eth0 -p udp -s any/0 --sport 53 --dport 1024:65535 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 53 --dport 1024:65535 -j ACCEPT
#ntp 開啟對外較時 port 123
$IPTABLES -A INPUT -m udp -p udp --sport 123 -d 0/0 --dport 123 -j ACCEPT
#icmp 8 0 ping
#$IPTABLES -A OUTPUT -o eth0 -p icmp --icmp-type 8 -d any/0 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p icmp -s any/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p icmp -s any/0 --icmp-type 0 -j ACCEPT
#80 開啟對外瀏覽網頁 port 80
$IPTABLES -A OUTPUT -o eth0 -p tcp --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 --dport 1024:65535 -j ACCEPT
#### 80 port 對外開放 port 80
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
# OUTPUT 放行 FORWARD 放行 INPUT 阻擋
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
本帖由dc最後編輯於2016-02-16 10:48
Your mind to my mind,
your thought to my thought |
| 發表時間:2015-05-15 18:27 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11722
註冊時間:2002-05-07 16:32 |
(第 23 篇)
Linux 漏洞更新
BASH ShellShock 漏洞分析
http://timhsu.chroot.org/2014/10/bash-shellshock.html
#檢查方式 Vulnerable 代表有問題需要更新 Not vulnerable 代表沒問題
env check='Not vulnerable' x='() { :;}; check=Vulnerable' bash -c 'echo $check'
#單獨更新 bash
yum install -y bash
----------------------------------------------------------------------------------------------------------------------
緊急應對Heartbleed危機 藉防火牆機制擋SSL漏洞
http://www.netadmin.com.tw/article_content.aspx?sn=1406040001&jump=1
OpenSSL Heartbleed 漏洞檢測 @ CentOS 6
http://jamyy.us.to/blog/2014/04/6260.html
OpenSSL Heartbleed (CVE-2014-0160)漏洞檢測與改善建議
http://www.icst.org.tw/ArticlesDetail.aspx?seq=1320
線上檢測
https://filippo.io/Heartbleed/
#查詢版本 OpenSSL 1.0.1~1.0.1f 與 OpenSSL 1.0.2~1.0.2-beta1 需要更新
openssl version -a
OpenSSL 1.0.1e-fips 11 Feb 2013 <-- 需要更新
#更新 openssl 這幾個是修正漏洞的版本 1.0.1e-16.el6_5.7 含之後, openssl-1.0.1e-16.el6_5.4.0.1.centos.{i686,x86_64}.rpm
#openssl-1.0.1 全系列, 除了 1.0.1g (含) 以後以及修補過的版本之外, 都有 Heartbleed 漏洞存在
yum -y install openssl
#查看版本是否已更新
rpm -q -a | grep "openssl"
openssl-1.0.1e-30.el6.8.x86_64 <--- 已更新
#查詢需要重新啟動的相關服務
lsof | grep ssl | grep DEL
mysqld 1424 mysql DEL REG 253,0 8397 /usr/lib64/libssl.so.1.0.1e
httpd 8597 apache DEL REG 253,0 8397 /usr/lib64/libssl.so.1.0.1e
#本例的話是 http 與 mysql
service mysqld restart
service httpd restart
OpenSSL 1.0.1 ~ 1.0.1f 和 1.0.2-beta 使用這些版本建出來的 SSL Key 會需要重新產生建立
接著請記得撤銷原本的簽章金鑰,重新簽署,並記得提交 CSR (Certificate Signing Request) 給 CA (Certification Authority)。
openssl req -new -newkey rsa:2048 -nodes -keyout hostname.key -out hostname.csr
#下載檢測工具
wget http://blogs.longwin.com.tw/wordpress/ssltest-cve-2014-0160.py -O ssltest.py
#開始檢查 not vulnerable 代表沒問題
python ssltest.py 127.0.0.1
Connecting...
Sending Client Hello...
Waiting for Server Hello...
... received message: type = 22, ver = 0302, length = 58
... received message: type = 22, ver = 0302, length = 845
... received message: type = 22, ver = 0302, length = 397
... received message: type = 22, ver = 0302, length = 4
Sending heartbeat request...
Unexpected EOF receiving record header - server closed connection
No heartbeat response received, server likely not vulnerable
本帖由dc最後編輯於2015-05-25 11:57
Your mind to my mind,
your thought to my thought |
| 發表時間:2015-05-25 11:15 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11722
註冊時間:2002-05-07 16:32 |
(第 24 篇) Linux 下計算檔案、資料夾大小的指令
資料來源:Orz快樂學電腦
顯示前 10 大佔用空間目錄 * 為路徑
du -s * | sort -rn | head -10
本帖由dc最後編輯於2015-10-26 15:06
Your mind to my mind,
your thought to my thought |
| 發表時間:2015-10-26 15:06 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11722
註冊時間:2002-05-07 16:32 |
(第 25 篇) 【教學】在 shell 裡新增排程
資料來源:askubuntu
add-lines-to-cron-from-script
| 代碼: |
#!/bin/bash
line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -
|
在 shell 裡刪除排程
資料來源:theunixtips
crontab -l -u userhere | grep -v command | crontab -u userhere -
*** 新增與刪除排程都必須使用 root 權限~
本帖由dc最後編輯於2015-10-27 12:48
Your mind to my mind,
your thought to my thought |
| 發表時間:2015-10-27 11:55 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11722
註冊時間:2002-05-07 16:32 |
(第 26 篇) 【轉貼】Shell脚本中的併發
資料來源:Just for fun
主要记录一下Shell脚本中的命令的并发和串行执行。
默认的情况下,Shell脚本中的命令是串行执行的,必须等到前一条命令执行完后才执行接下来的命令,但是如果我有一大批的的命令需要执行,而且互相又没有影响的情况下(有影响的话就比较复杂了),那么就要使用命令的并发执行了。
看下面的代码:
| 代碼: |
#!/bin/bash
for(( i = 0; i < ${count}; i++ ))
do
commands1
done
commands2
|
对于上面的代码,因为每个commands1都挺耗时的,所以打算使用并发编程,这样就可以节省大量时间了。
修改后的代码如下:
| 代碼: |
#!/bin/bash
for(( i = 0; i < ${count}; i++ ))
do
{
commands1
}&
done
commands2
|
这样的话commands1就可以并行执行了。 实质是将commands1作为后台进程在执行,这样主进程就不用等待前面的命令执行完毕之后才开始执行接下来的命令。
但是我的本来目的是让commands1的这个循环都执行结束后,再用command2去处理前面的结果。如果像上面这样写的话,在commands1都还没结束时就已经开始执行commands2了,得到了错误的结果。
再次修改代码如下:
| 代碼: |
#!/bin/bash
for(( i = 0; i < ${count}; i++ ))
do
{
commands1
}&
done
wait
commands2
|
上面这样就可以达到预期的目的了,先是所有的commands1在后台并行执行,等到循环里面的命令都结束之后才执行接下来的commands2。
对于上面的代码,如果count值特别大的时候,我们应该控制并发进程的个数,不然会影响系统其他进程的运行,甚至死机。
续 Shell脚本中的并发(1)
上篇主要是写的如何在Shell脚本中编写并发程序,这次写一下如何控制进程的数量。
在网上参考了一下别人的方法,主要都是利用管道的思想。
参考如下程序:
| 代碼: |
#!bin/bash
PRONUM=10 #进程个数
tmpfile="$$.fifo" #临时生成管道文件
mkfifo $tmpfile
exec 6<>$tmpfile
rm $tmpfile
for(( i=0; i<$PRONUM; i++ ))
do
echo "init."
done >&6
for(( i = 0; i < ${count}; i++ ))
do
read line
#echo $line
{
commands
echo "line${i} finished."
} >&6 &
done <&6
wait
|
初始时给管道内写入PRONUM个字符串,然后每从管道内读出一个字符串就生成一个子进程,当管道内没有字符串可读时就阻塞在那里,不能创建新的子进程,一直等到有新的字符串进来时才继续运行。当每个并发进程执行完毕时又向管道内写入一个字符串,表示当前子进程已执行完毕,可以创建新的子进程了。
本帖由dc最後編輯於2015-11-06 09:53
Your mind to my mind,
your thought to my thought |
| 發表時間:2015-11-06 09:52 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11722
註冊時間:2002-05-07 16:32 |
(第 27 篇)
因為主機被關機在查詢關機的時間點的指令,只是重開機時間是未來時間很詭異...
查詢重新開機的時間
#last reboot
reboot system boot 3.10.0-229.14.1. Mon Nov 9 17:16 - 09:35 (-7:-40)
reboot system boot 3.10.0-229.14.1. Sun Oct 25 02:43 - 09:35 (15+06:51)
reboot system boot 3.10.0-229.el7.x Fri Oct 23 23:58 - 18:43 (18:44)
reboot system boot 3.10.0-229.el7.x Fri Oct 23 15:13 - 15:37 (00:24)
reboot system boot 3.10.0-229.el7.x Fri Oct 23 14:20 - 15:12 (00:52)
reboot system boot 3.10.0-229.el7.x Fri Oct 23 12:25 - 14:19 (01:54)
查詢重新開機的時間
# grep reboot /var/log/messages
Nov 9 17:16:10 dcweb systemd: Started Mark the need to relabel after reboot.
查詢系統關機的時間
# grep halt /var/log/messages
查詢開機的時間
# date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"
2015-11-09 09:15:58
查詢開機多久的時間
# uptime
09:35:36 up 19 min, 1 user, load average: 0.00, 0.01, 0.05
列出最後10筆系統登入重開機資訊
#last -n 10
Your mind to my mind,
your thought to my thought |
| 發表時間:2015-11-09 09:49 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11722
註冊時間:2002-05-07 16:32 |
(第 28 篇) Shell Script 讀取參數
資料來源:Linux 技術手札
在 UNIX Like 環境下輸入指令時, 可以按照不同的用法輸入不同的參數, 以下是在 Shell Script 讀取輸入的參數的寫法。
Shell Script 使用輸入的參數, 其實只要調用以數字名命的變數, 如 $1, $2, $3 …… 例如執行以下指令:
| 代碼: | | ./shell_test.sh var1 var2 var3 |
上面執行 Shell Scrpt -> shell_test.sh, 並輸入 3 個參數: var1, var2 及 var3, 用 Shell Script 調用參數的寫法如下:
shell_test.sh:
| 代碼: | #!/bin/sh
echo "Total argument: $#"
echo "Script name: $0"
echo "Argument 1: $1"
echo "Argument 2: $2"
echo "Argument 3: $3"
|
執行結果是:
| 代碼: | ./shell_test.sh var1 var2 var3
Total argument: 3
Script name: ./shell_test.sh
Argument 1: var1
Argument 2: var2
Argument 3: var3
|
另一個情況是想將所有參數完整地印出, 不用 $1, $2, $3… 逐一出寫出, 可以調用 $@, 例如:
shell_test.sh:
| 代碼: | #!/bin/sh
echo "All Argument: $@" |
執行結果是:
| 代碼: |
./shell_test.sh var1 var2 var3
All Argument: var1 var2 var3 |
Your mind to my mind,
your thought to my thought |
| 發表時間:2015-11-09 15:07 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11722
註冊時間:2002-05-07 16:32 |
(第 29 篇) 【教學】用shell實現bat的pause
資料來源:Linux Wiki.cn
windows批處理程序中的pause命令可以實現「按任意鍵繼續」的效果,要在shell中實現這一功能,可以藉助read。
Note.gif注意:
注意不是所有的shell提供的read都支持本文介紹的方法。目前本文已確定適用於bash。
簡單實現
你可能還沒注意到read的強大功能,其實只要用下面的代碼,就可以實現簡單的"pause"。
read -n 1 -p "Press any key to continue..."
但它有明顯的不足:
如果用戶輸入的不是回車,雖然能"continue",但沒有輸出換行,導致輸出格式混亂。(直接在命令提示符下運行更為突出)。
用戶輸入的字元會顯示在屏幕上,影響美觀。
如果進行了輸入重定向,哪怕有:
while read line
do
…
read -p somevar
…
done < somefile
這樣的代碼,都會導致錯誤。
改進
關於重定向引發的錯誤,如果需要,可以用文件描述符代替重定向解決。目前沒有想到更好的解決方案。主要針對前兩個不足做了改進。
read -n 1 -p "Press any key to continue..." INP
if [ $INP != '' ] ; then
echo -ne '\b \n'
fi
說明:
記錄了輸入的字元(存到$INP),以便處理。
注意如果輸入的是回車,read一個字元也讀到,而不是讀到
。
當輸入不是換行時,用退格蓋掉原來的空格。
為了方便使用,可以寫成:
function pause(){
read -n 1 -p "$*" INP
if [ $INP !='' ] ; then
echo -ne '\b \n'
fi
}
#use time
pause 'Press any key to continue...'
仍存有的問題:
對空格和Tab支持不好。
重定向的問題沒有解決。
Your mind to my mind,
your thought to my thought |
| 發表時間:2015-11-13 13:42 |
|
dc
管理員

性別:男
來自:瓦肯星
發表總數:11722
註冊時間:2002-05-07 16:32 |
(第 30 篇) 取得網卡的IP
資料來源:Tsung's Blog
取得所有IP
/sbin/ifconfig | awk -F'[ :]+' '/Bcast/{print $4}'
以下為原創
如果有多張網卡只想取得 172 開頭的第一個網卡IP
declare -a iplist
iplist=(`/sbin/ifconfig | awk -F'[ :]+' '/Bcast/{print $4}' | grep 172`)
ip=${iplist[0]}
echo $ip
Shell Script 檢查檔案及目錄是否存在
資料來源:Linux 技術手札
在 Shell Script 檢查檔案及目錄是否存跟 Perl 很相似, 都是透過 -e 及 -d 在 if 裡面判斷, 寫法如下:
檢查目錄是否存在
#!/bin/sh
if [ -d "/path/to/dir" ]; then
# 目錄 /path/to/dir 存在
echo "Directory /path/to/dir exists."
else
# 目錄 /path/to/dir 不存在
echo "Directory /path/to/dir does not exists."
fi
檢查檔案是否存在
#!/bin/sh
if [ -f "/path/to/dir/filename" ]; then
# 檔案 /path/to/dir/filename 存在
echo "File /path/to/dir/filename exists."
else
# 檔案 /path/to/dir/filename 不存在
echo "File /path/to/dir/filename does not exists."
fi
Shell Script 檢查空目錄
資料來源:Linux 技術手札
在 Shell Script 可以透過 ls 指令來檢查空目錄, 例如我想檢查 /home/user 目錄, 可以這樣做:
#!/bin/bash
dir="/root/"
if [ "$(ls -A $dir)" ]; then
### 不是空目錄
echo "$dir is not empty!"
else
### 空目錄
echo "$dir is empty!"
fi
以上第 3 行用了 ls -A 指令, -A 選項可以將 ls 的輸出忽略 “.” 及 “..”。
如果是要計算目錄檔案數量的話可用
[ $(ls $DIR |wc -l) -eq 0 ]
如果是要判斷如果是空的就執行動作前面加上 !
例如
if [ ! "$(ls -A $dir)" ]; then
### 空目錄
echo "$dir is empty!"
fi
crontab 執行添加日誌
資料來源:segmentfault
调试方法:添加日志文件,将原来所有的echo 全部可以尝试追加到日志文件,或者在crontab写的时候追加日志.
45 14 * * * /backuptoqiniu/backuptoqiniu.sh >> /tmp/out.log 2>&1
使用GNU的time來記錄執行時間
資料來源:酷!學園
#/usr/local/bin/time -po 1.txt cp -af /lvs/read/1mb /local/r/1mb
請注意time的路徑
time 輸出到 1.txt 這個檔案 後面接的是要執行的指令
Linux查找文件内容的常用命令方法。
資料來源:志在千裏-ChinaUnix
从文件内容查找匹配指定字符串的行:
$ grep "被查找的字符串" 文件名
例子:在当前目录里第一级文件夹中寻找包含指定字符串的.in文件
grep "thermcontact" */*.in
从文件内容查找与正则表达式匹配的行:
$ grep -e “正则表达式” 文件名
查找时不区分大小写:
$ grep -i "被查找的字符串" 文件名
查找匹配的行数:
$ grep -c "被查找的字符串" 文件名
从文件内容查找不匹配指定字符串的行:
$ grep -v "被查找的字符串" 文件名
从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行
find / -type f -name "*.log" | xargs grep "ERROR"
例子:从当前目录开始查找所有扩展名为.in的文本文件,并找出包含”thermcontact”的行
find . -name "*.in" | xargs grep "thermcontact"
awk 如何判断一个字符串是否为纯数字?
資料來源:搜狗问问
echo "123" |awk '{if($0 ~ /^[0-9]+$/) print $0;}'
解决sudo: sorry, you must have a tty to run sudo
資料來源:fsxchen
前几天遇到一个问题,在一个终端中调用另一个shell,始终是无法执行的,后来捕捉到报错信息为sudo: sorry, you must have a tty to run sudo,后来,在网上了解到可以如下解决:
1. 编辑 /etc/sudoers
1)Defaults requiretty,修改为 #Defaults requiretty,表示不需要控制终端。
2)Defaults requiretty,修改为 Defaults:nobody !requiretty,表示仅 nobody 用户不需要控制终端。
如果修改为 Defaults:%nobody !requiretty,表示仅 nobody 组不需要控制终端。
其实只要注释掉)Defaults requiretty 那个就可以了。表示在执行的时候不打开终端。但是,有的shell必须要有终端才可以执行。这样显然是不行的。后来,又找到一片文章才搞定。下面为抄录的,仅为记录以后使用。
有些程序/脚本可能在没有控制终端的环境下上执行(如系统启动服务时, Daemon,
或者是setsid启动的程序等) 但可能这个程序需要控制终端, 这这么办呢?
如我们的例子: 我们在linux启动时启动一个服务, 可是中间有个程序(旧的systemtap)使用了sudo
但sudo需要控制终端(当然可以通过修改sudo的配置文件, 但这样很对用户不友好啊)
例子: (setsid 启动的程序会失去控制终端)
# setsid sudo ls
sudo: sorry, you must have a tty to run sudo
(如果你的系统没有输出这句话, 那就是你的系统的sudo配置文件允许sudo可以在这个,
请确保已经设置了Defaults requiretty)
没有控制中断的时候, 打开控制终端是这样的效果:
# setsid head -c 0 /dev/tty
head: cannot open `/dev/tty' for reading: No such device or address
为了解决这个问题, 所以应该使用能创建(伪)控制终端的程序来启动你的程序如: script, expect
如:
# setsid script -c "sudo ls" /dev/null
或:
# setsid expect -c 'spawn sudo ls; expect'
#打开控制终端成功:
# setsid script -c 'head -c 0 /dev/tty' /dev/null
# setsid expect -c 'spawn head -c 0 /dev/tty; expect'
不过 setsid 跟 script 组合使用有着奇怪的bug, 我这段时间非常的depression,
这样对script, expect来说, 都是大材小用了
本帖由dc最後編輯於2015-12-22 14:32
Your mind to my mind,
your thought to my thought |
| 發表時間:2015-12-02 12:19 |
|
|
所有時間均為GMT+8, 現在是2026-06-10 12:54 分頁:[ 1 2 3 4 5 ] |
|