linux 无root安装Tcl、Expect工具

linux下面无root安装,自测可以全局使用

我这里使用的是自己下载的安装包,也可以通过命令去下载

  • 下载:tcl版本 8.4.19
    http://sourceforge.net/projects/tcl/files/Tcl/8.4.19/tcl8.4.19-src.tar.gz/download
  • 下载expect版本5.45:
    http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/d

安装前提条件

  1. 首先在linux下创建两个目录
    linux 无root安装Tcl、Expect工具_第1张图片
  2. 分别把下载后的压缩包上传到目录中,然后分别解压
tar xzvf tcl8.4.19-src.tar.gz

在这里插入图片描述在这里插入图片描述

安装操作

安装tcl

  1. 进入刚刚解压的 /app/local/tcl/tcl8.4.19/unix 目录
cd /app/local/tcl/tcl8.4.19/unix
  1. 执行命令
 ./configure --prefix=$HOME

3.执行命令

make
  1. 执行命令
make install
  • whereis tcl 检测

安装ecpect

  1. 进入解压目录
cd /app/local/expect/expect5.45
  1. 执行命令
 ./configure --prefix=$HOME

3.执行命令

make
  1. 执行命令
make install
  • which expect 检测
    • command -v expect

安装完成。自行测试

在测试的时候需要给文件赋权

chmod a+x a.sh
a.sh 是文件名称

下面是我写的一个定时清理日志脚本

登录多台服务器进行清理

  • a.sh
#!/bin/bash
IP=10.46.20.162
PORT=22
USER=jboss
PASSWORD=appuseR1@Cwgs
ips=(10.46.20.162 10.46.20.163)
 
length=${#ips[@]}
 
for (( i = 0; i < $length; i ++ ))
do
    IP=${ips[i]}
    ./b.sh $IP $PORT $USER $PASSWORD
done

  • b.sh
#!/home/jboss/bin/expect -f
set IP [lindex $argv 0]
puts $IP
set PORT [lindex $argv 1]
puts $PORT
set USER [lindex $argv 2]
puts $USER
set PASSWORD [lindex $argv 3]
puts $PASSWORD
spawn ssh -l $USER $IP
#设置连接的超时时间为30秒.
set timeout 60
expect {
	"yes/no" { send "yes\r";exp_continue}
	"*assword*" { send "$PASSWORD\r"}
	timeout { puts "expect was timeout"; return }
}
send_user "连接成功 $IP $USER $PASSWORD"
expect "~]" #通配符
send "cd /app/logs/clear\r"
expect "]" #通配符
send "ls\r"
expect "]" #通配符
send "sh c.sh\r"
expect "]" #通配符
send "logout\r"
expect eof # 退出此expect交互程序

  • c.sh
#!/bin/bash
#输出/app/logs下所有文件夹名称
#定义是否清理全部文件/否则删除一周前的
judgeClearAll="0"
#主目录路径
mainPath=/app/logs
#条件文件名称
mainFile=/run.log
#获取最早修改文件名称
minDateFileName=""
function minDateFileNameMethod(){
	#遍历这个文件夹文件,条件为*.log *.gz 并且排除run.log文件,最后排序
	for file in $(find ${1} -type f ! -name 'run.log' -a -name '*.log' -o -name '*.gz' -print |xargs ls -rt)
		do
			#自取第一个文件,直接结束
			minDateFileName="$file"
			echo "获取到最早修改文件名称 $minDateFileName"
			break
		done
}
#获取最早修改文件日期
minDateFileDate=""
function minDateFileDateMethod(){
	#文件名
	FILE_NAME=${1}
	#获取文件做后修改时间戳
	LAST_MODIFY_TIMESTAMP=`stat -c %Y  $FILE_NAME`
	#格式化时间戳
	#formart_date=`date '+%Y-%m-%d %H:%M:%S' -d @$LAST_MODIFY_TIMESTAMP`
	formart_date=`date '+%Y-%m-%d' -d @$LAST_MODIFY_TIMESTAMP`
	minDateFileDate=$formart_date
	echo "获取到最早修改文件时间 $minDateFileDate"
}
#传入一个日期和当前日期进行比较 返回:1 0
function judgeDateMethod(){
	#获取当天日期
	now_date=`date +%Y-%m-%d`
	#格式化日期Wie时间戳进行比较
	t1=`date -d "${1}" +%s`
	t2=`date -d "$now_date" +%s`
	if [ $t1 -eq $t2 ]; then
		echo "根据文件日期和当天比较 ${1} == $now_date"
		return "0"
	elif [ $t1 -lt $t2 ]; then
		echo "根据文件日期和当天比较 ${1} < $now_date"
		return "1"
	else
		echo "根据文件日期和当天比较 ${1} > $now_date"
		return "0"
	fi
}
#这里使用的是秒数,当日减去以前日期,除以一天的秒数 得到相差天数
function numberDayMethod(){
	now_date=`date +%Y-%m-%d`
	num1=$(date +%s -d $now_date)
	num2=$(date +%s -d ${1})
	sum=$(($num1-$num2))
	sum=$(($sum/86400))
	echo "两日期相差天数 $now_date - ${1} = $sum"
	return $sum
}
#日志文件清理工作
function clearLogMethod(){
	#计算最初日志时间和当天日期相差天数
	numberDayMethod ${1}
	day=$?
	#得到相差天数,根据相差天数进行清理
	if [ $day -gt "7" ]; then
		echo "删除此文件夹下的7天前 *.log *.gz 数据 ${2}"
		#进行日志清理工作
		echo "find ${2} -mtime +7 -name '*.log' |xargs rm -f"
		$(find ${2} -mtime +7 -name '*.log' |xargs rm -f)
		echo "find ${2} -mtime +7 -name '*.gz' |xargs rm -f"
		$(find ${2} -mtime +7 -name '*.gz' |xargs rm -f)
	else
		echo "由于相差日期小于7天,不做删除!"
	fi 
	#$(find ${2} -type f -name *.s |xargs rm -f) 测试使用
}
#对存在run文件的文件夹做处理
function disposeFileMethod(){
	#判断这个文件夹下面的文件数量是否大于1
	if [ "$(ls -l ${1} |grep "^-"|wc -l)" -gt "1" ]; then
		#通过文件夹获取最早修改文件名称
		minDateFileNameMethod ${1}
		#通过文件名称获取到文件最后修改时间
		minDateFileDateMethod $minDateFileName
		#通过当前时间和文件最后时间做比较
		judgeDateMethod $minDateFileDate
		#如果返回值为1,那么就是在今天之前有文件
		if [ $? -eq "1" ]; then
			#进行日志清理工作
			clearLogMethod $minDateFileDate ${1}
		else
			echo "在今天之前没有文件,或者时间有误!"
		fi
	else
		echo "文件数量小于等于1个,不做处理!"
	fi
}
#判断文件夹里面是否有run.log文件 1:有 0:无
function judgeRunLogMethod(){
	if [ -f "${1}$mainFile" ]; then
		return "1"
	else
		return "0"
	fi
}
#遍历文件夹
function traversalFolderMethod(){
	# for 循环${1}传入的路径遍历出文件夹
	for files in $(ls -l ${1} | awk '/^d/ {print $NF}')
		do
			#判断文件夹里是否有run.log日志
			judgeRunLogMethod ${1}/$files
			if [ "$?" -eq "1" ]; then
					#如果等于1说明有日志文件
				echo ${1}/$files$mainFile
					disposeFileMethod ${1}/$files
			else
					#否则接着往下找
					traversalFolderMethod ${1}/$files
			fi
		done
}
echo "***定时任务开始 $(date "+%Y-%m-%d %H:%M:%S") ***"
traversalFolderMethod $mainPath
echo "***定时任务结束 $(date "+%Y-%m-%d %H:%M:%S") ***"

你可能感兴趣的:(java)