匯入公開金鑰到信任認證
keytool -import -file catserver.cer -keystore "$JAVA_HOME/lib/security/cacerts" -alias catserver
刪除公開金鑰別名
keytool -delete -alias catserver -keystore cacerts -storepass changeit
遠端偵錯代碼
export JVM_OPT="$JVM_OPT -Dosgi.console=33801"
export JVM_OPT="$JVM_OPT -Xdebug -Xrunjdwp:transport=dt_socket,address=****:33802,server=y,suspend=y"
偵錯模式運行jar包
java -Dosgi.console=33801 -Xdebug -Xrunjdwp:transport=dt_socket,address=****:33802,server=y,suspend=y -cp *.jar ***
sed命令替換檔案內容
sed -i 's?securerandom.source=file:/dev/random?securerandom.source=file:/dev/./urandom?g' ***
重啟sshd服務
/etc/init.d/ssh restart
/etc/init.d/sshd restart
jar 檔案打包
jar -cvf test.jar com/bbb.class aaa.class
查看連接埠佔用情況:
netstat -npl | grep ***
尋找檔案
find / -name cacerts 2>/dev/null
尋找java路徑
which java
vim 尋找時忽略大小寫
項的影響,當 "\c" 或 "\C" 起作用時,它們設成什麼值無關緊要。
vim 替換
: %s/source/des/g
%表示操作每一行
g表示替換一行中的每個匹配
設定linux機器硬體時間
hwclock --show 顯示時間
hwclock --systohc 將系統時間同步到硬體
ubuntu 安裝和卸載deb包
sudo dpkg -i 軟體包名.deb
sudo apt-get remove 軟體包名
同步時間
用戶端:ntpdate ip
server端:ntp
為機器添加公開金鑰
1.修改/etc/ssh/sshd_config(許可權和公開金鑰路徑)
2.在使用者主目錄下添加 .ssh 檔案夾 許可權600
3.在.ssh檔案夾下添加 authorized_keys 檔案 許可權600
linux曆史命令不可用
vim /etc/profile
設定HISTSIZE=1000
設定連線逾時時間:
vim /etc/profile
設定TMOUT=0
windows下findStr用法(類似linux中的grep)
netstat -na | findstr 12345
輸出重新導向
>>logs/root.log 2>&1 &
查看linux版本資訊
cat /proc/version
eclipse設定main函數參數
右鍵 -> run as -> run configuration
解壓.xz檔案
xz -d linux-3.1-rc4.tar.xz
解壓.tar檔案
tar -xf linux-3.1-rc4.tar
解壓.tar.gz到指定檔案夾
tar -xzf jre-8u144-linux-x64.tar.gz -C /usr/lib/java`
壓縮得到.tar.gz檔案
tar -czf all.tar.gz *.jpg
註:
解壓檔案的時候,檔案夾是合併作業,檔案是覆蓋操作
得到壓縮檔的時候,是完全的覆蓋操作
cp命令也一樣,檔案夾是合併作業,檔案是覆蓋操作
shell指令碼編程-算術運算
val=`expr 2 + 2`
輸出重新導向
>>logs/root.log 2>&1 &
echo 輸出丟失分行符號
要保留分行符號,使用如下命令 注意雙引號一定不能少
echo "${foo}"
重啟機器:
reboot
退出指令碼運行
exit 0
if else語句用法:
if [ "$yesResult" != "" ];then
break
elif [ "$noResult" != "" ];then
echo "1"
elif [ "$unknownResult" != "" ];then
echo "2"
echo "${unknownResult}"
exit 0
else
echo "4"
echo "${out}"
exit 0
fi
while語句用法:
while "true"
do
........
done
for語句用法 + 按名字尋找進程並關閉所有進程:
processCount=0
for processId in `ps -ef | grep xxx |grep java | awk '{print $2}'`
do
processCount=`expr $processCount + 1`
out=`kill $processId`
done
for遞增迴圈
for((i=0;i<10;i++))
do
echo "$i"
sleep 0.1
done
shell命令列按刪除鍵無效
stty erase '^H'
檢查並安裝java環境
#install jre environment
echo -e "\nchecking java environment..."
string=`java -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $2 }'`
version=`java -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }'`
if [ $string == version ] ; then
echo -e "java exist! version--$version\n"
else
echo "java environment not found,installing....."
#make a floder and discard stderr output
out=`mkdir /usr/lib/java 2>/dev/null`
#unzip the file
out=`tar -zxf jre-8u144-linux-x64.tar.gz -C /usr/lib/java`
out=`update-alternatives --install /usr/bin/java java /usr/lib/java/jre1.8.0_144/bin/java 300 2>/dev/null 1>/dev/null`
echo -e "install java succeed!\n"
fi
得到連結檔案指向的位置
readlink -f
awk設定分隔字元
awk -F '/bin/java' '{print $1}'
在指令碼中調用其他指令碼時輸入直接在後面跟參數即可傳進行
被調用的指令碼直接$1 $2 使用即可 超過10 用${10}(從1開始,沒有$0)
指令碼睡眠:
sleep 5(單位是秒,可以有小數點,比如說0.1)
xftp顯示隱藏檔案夾
開啟:工具--》選項--》常規 裡面有一個“顯示隱藏的檔案”的選項,勾上即可。
linux顯示隱藏檔案夾
ctrl + h
遞迴修改使用者和使用者組
chown -R ossuser:ossgroup ./
vim 修改檔案格式:
:set ff=unix
shell grep 使用的是Regex
如grep ".*aaa" 表示以a結束的字元
每隔1s迴圈向檔案中輸入內容 大於100自動停止
count=1
while "true"
do
count=`expr $count + 1`
echo "$count" >> test____^_^____.txt
sleep 1
done
設定xftp預設覆蓋
工具->選項->傳輸->進階選項->覆蓋檔案 將上傳下載都改為overwrite
nohup ./test.sh & 解決問題 不管原來的進程(指令碼,或是java程式,或是其他)是否還在執行,指令碼都會繼續執行
如果不用(nohup ./test.sh &)這種寫法,如果之前的進程正常執行結束,進程開啟的指令碼可以正常執行,但是如果進程是kill掉的,那麼啟動的指令碼也會被結束
比如說用了process.waitFor();等待結束的進程被kill掉了。
在java代碼中調用UP指令碼去執行另一個ST指令碼的時候
ST 中有echo -e這種文法的時候 後面的列印日誌的語句無法正常輸出到log檔案
在UP.sh中沒有用out=`./ST.sh `這種寫法的時候 ST.sh一直無法執行成功,不知道原因
ubuntu設定軟體開機自動運行jar包
有兩個rc.local檔案。/etc/init.d/rc.local檔案會在系統啟動的時候調用/etc/rc.local檔案。一般將啟動內容放在/etc/rc.local檔案中
指令碼rc.local中執行其他目錄中的指令檔時並不知道目錄相關資訊,但是指令碼執行的時候可能需要使用相對路徑。可以這樣操作,以調用/home/copbint/Test/start.sh為例:
sed -i '/sleep 10 && /d' /etc/rc.local
hasExit=`cat /etc/rc.local | grep "^exit 0$"`
if [ "$hasExit" = "" ];then
echo "sleep 10 && /bin/bash /home/copbint/Test/start.sh" >> /etc/rc.local
else
sed -i '\#^exit 0$#i sleep 10 && /bin/bash /home/copbint/Test/start.sh' /etc/rc.local
fi
以行為單位進行解釋:
1.執行前先刪除,防止此命令多次重複執行的時候重複添加
2.確認指令碼中是否有^exit 0$,^表示行起始符,$表示行結束符,過濾掉注釋中的exit 0。
4.如果指令碼中沒有^exit 0$。直接在指令碼追加內容即可。
6.如果指令碼中有^exit 0$。在此行前面插入一行。這是sed命令的用法。不熟悉的可以參考: linux sed命令用法舉例
另,注意下面這兩種錯誤的寫法:|
#i 後面不能跟#,會當成一般字元一起輸入:
sed -i '\#^exit 0$#i#sleep 10 && /bin/bash /home/copbint/Test/start.sh' /etc/rc.local
命令最後面也不能跟#,會當成一般字元一起輸入:
sed -i '\#^exit 0$#i sleep 10 && /bin/bash /home/copbint/Test/start.sh#' /etc/rc.local
使用expect自動進行遠程登陸並執行命令(需要先執行 sudo apt-get install 命令進行安裝
#!/usr/bin/expect
set timeout 5
#set username [lindex $argv 0] //儲存指令碼參數到變數中
#set password [lindex $argv 1]
#set hostname [lindex $argv 2]
spawn ssh xxxx@127.0.0.1
expect {
"(yes/no)?"
{
send "yes\n"
expect "password:"
send "xxxxx\n"
}
"password:"
{
send "xxxxx\n"
}
}
expect "~"
#sleep 0.5
send "cd /home/xxxx/Test\n"
expect "~"
#sleep 0.5
send "echo `date` >> haha.txt\n"
interact
遇到一個大坑就是,最外層的expect的大括弧我換行了,導致一直不能自動輸入密碼。一直找不到原因,最後對照著別人的指令碼試著修改才找到此處不對,不知道這背後有什麼規則。但是裡層的expect 又可以換行。
一點心得:
其實expect的工作原理就是監測伺服器發送回來的報文,或者說發給shell的內容,雖然不知道具體在哪個層次做的捕獲。螢幕上的提示資訊,比如“xxx@ubuntu:~/Test$”,都是從伺服器端返回的。所以說,如果expect捕獲到期望的內容,就知道可以繼續用send命令發送下一個命令讓伺服器執行了。
所以說還有一種暴力的方法,直接每條要send的命令後面進行一定時間的睡眠,而不用expect,一般來說,伺服器都能夠正常將命令執行完。當然,暴力而不夠優雅,而且可能不能保證準確。
interact的作用是將互動許可權交給使用者進行操作。如果指令碼結尾不加 interact,串連就會被關閉,而關閉串連相比於命令執行的優先順序可能更高,這有可能導致最後的某些命令不被執行,所以說可能在最後一個命令後進行一定時候的睡眠,從而保證所有的命令都被正常執行。
查看檔案或檔案夾大小
du -sh
字串轉ascii碼
printf "%d\n" "'A'"
構造一個ascii碼對照表
echo "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZaccdefghijklmnopqrstuvwxyz">a.txt;od -t d1c a.txt