linux常用命令与shell脚本编程

导入公钥到信任证书
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 使用的是正则表达式
如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 [email protected]
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,连接就会被关闭,而关闭连接相比于命令执行的优先级可能更高,这有可能导致最后的某些命令不被执行,所以说可能在最后一个命令后进行一定时候的睡眠,从而保证所有的命令都被正常执行。

关于 expect eof

好奇你的肯定会问最后那个expect eof是干嘛的。

这是因为没有expect eof程序就直接退出了,因为没什么可干的了。显然这样是有问题的,因为我们的程序实际上是没执行完的。

spawn启动的程序在结束的时候会产生一个eof标示,expect eof会等待程序的退出标示,一旦匹配就什么也不做,是的什么也不做,没什么可做也就退出了。

这样就完了吗?不,还有很大的问题,还记得之前说的expect的超时时间么,是的是10秒, 如果程序执行时间超过10秒或更久,显然expect eof会超时,程序会直接退出,解决办法就是设置timeout

下面给出一个远程备份文件的例子,来说明问题

#!/usr/bin/env expect
# 假设用户名和密码都是admin
spawn rsync [email protected]:~/data .
set timeout 600 #设置expect超时时间为10分钟,如果不设置同步则无法正确完成
expect {
    password: {
        send admin
    } connecting {
        send yes\n
        expect {
            password: {
                send admin
            }
        }
    }
}
expect eof



查看文件或文件夹大小

du -sh


字符串转ascii码
printf "%d\n" "'A'"


构造一个ascii码对照表
echo "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZaccdefghijklmnopqrstuvwxyz">a.txt;od -t d1c a.txt















猜你喜欢

转载自blog.csdn.net/qq_31567335/article/details/78822855