作者:matrix
发布时间:2020年10月28日星期三
分类:command Linux
mac上使用ssh命令隧道转发访问内网会出现经常断连的情况,每次都需要重启窗口执行命令,没有windows上xshell上隧道设置来的简单好用。当然,后面我发现Termius.app支持端口转发后,依然觉得autossh的方式香~
换用autossh来代替ssh,只需要添加-M参数用于设定监听的本地端口,本地不被占用的都可以。
autossh安装
autossh就用来解决断线重连的问题。
测试环境为macos
autossh安装:brew install autossh
要自动免密码登录目前知道两个方法:
方法1 密钥登录
无密码密钥登录,配合autossh可以稳定使用。
方法2 autossh+expect
这里主要介绍自动输入密码的方式,可以解决各种场景的问题。
使用autossh+expect
的方式用脚本操作,支持ssh登录密码、密钥密码都可配置输入,所以这个是真正能解决很多自动化处理的问题。
autossh.sh文件
#!/bin/bash
# macos下测试使用
# 执行之后在窗口中ctrl+c终止连接进程
PASS='XXXXX' #ssh登录密码
CMD=$@
BASE_CMD='/usr/local/bin/autossh' # autossh 执行路径
trap 'ps aux|grep "$BASE_CMD $CMD" |grep -v grep | awk "{print \$2}" | xargs kill &>/dev/null && echo "stop done.\n"' 2 # ctrl + c 按键后执行命令终止子进程
VAR=$(expect -c "
spawn $BASE_CMD $CMD
match_max 100000;
while (1) {
# 匹配关键字password,之后发送密码
expect \"*?password:*\" {send -- \"$PASS\r\"}
# 下面的方式执行失败
#set connectedFlag 0;
# set timeout 60;
# expect {
# '?sh: Error*'
# { puts 'CONNECTION_ERROR'; exit; }
# '*yes/no*'
# { send 'yes\r'; exp_continue; }
# '*?assword:*' {
# # send '$PASS\r'; set timeout 4;
# send -- \"$PASS\r\"
# expect '*?assword:*' { puts 'WRONG_PASSWORD'; exit; }
# set connectedFlag 1;
# }
# # if no password
# '*~*'
# { send 'echo hello\r'; set connectedFlag 1; }
# }
}
")
echo "==============="
echo "$VAR"
tail -f /dev/null # 前台挂起主进程
注意:
密码中出现脚本元字符$
需要转义处理\$
如果ssh命令指定密钥登录提示输入密码passphrase,一样的操作需要匹配关键字passphrase
然后发送密码和回车符即可。
脚本中自动输入密码的实现方式也有其他,比如sshpass
使用
bash ./autossh.sh -M 1234 -p 22 -L 127.0.0.1:8088:182.18.1.2:8088 root@SERVER_HOST
说明:
-M 1234 :autossh的参数用于监听ssh是否断线。如果启动多个隧道命令,此端口不能重复使用,随意更换即可。
127.0.0.1:8088:182.18.1.2:8088,连接服务器后将服务器182.18.1.2:8088转发到本地127.0.0.1:8088
ctrl + c 按键终止
参考:
Linux autossh 实现SSH 密码自动输入,自动登录的方法
转:expect脚本实现autossh自动输入密码 ssh自动登录
autossh参数参考:
http://www.freeoa.net/osuport/netmanage/autossh-useage-refer_2831.html
http://www.freeoa.net/osuport/netmanage/ssh-automatic-login-config_285.html
https://cloud.tencent.com/developer/ask/89349
https://blog.csdn.net/csdn_changsha/article/details/103631673
ssh + sshpass 自动输入密码登录服务器
https://www.cnblogs.com/hongdada/p/13711688.html
作者:matrix
发布时间:2019年11月6日星期三
分类:command Linux

awk用于unix的文本处理,经常出现和使用。读取每一行文本进行格式化输出。
测试环境 Macos
awk简单操作
默认使用空格进行字符串分割
echo '1 2 3' |awk '{print $0}' # 1 2 3
echo '1 2 3' |awk '{print $3}' # 3
echo -e "1\n2\n3" |awk '/[23]/' #正则条件查找
echo -e "abc\n1a2\n33" |awk '/a/' #正则条件查找字母a
awk '{print $3}' file_path #指定文件
ls -alh|awk '/^d/' #输出目录
# drwxr-xr-x 3 panc staff 96B 7 16 23:32 pt-program
echo '1-2-3' |awk -F '-' '{print $2}' #指定分割符号 - 输出 2
$0
表示当前行
$1
表示第一个分割的字段
awk命令后面跟操作的语句字符串''
包裹,每个语句段落用花括号{}
包裹,语句段落中用分号;
分隔语句。
echo -e '1 2 3\n4 5 6' |awk '{print $0;print("-end-")}'
echo -e '1 2 3\n4 5 6' |awk '{print $0;}{print("-end-")}'
#上面输出结果相同
#1 2 3
#-end-
#4 5 6
#-end-
echo -e '1 2 3\n4 5 6' |awk '{print $1,$3}'
#输出
#1 3
#4 6
使用内置变量
NF
表示当前行有多少个分割字段
echo '1-2-3' |awk -F '-' '{print $(NF)}' # 3 获取最后一个分割字符
echo '1-2-3' |awk -F '-' '{print $(NF-1)}' # 2 获取倒数第二个分割字符
其他变量
NR
表示当前处理的是第几行
BEGIN预处理
在执行处理之前提前设置一些信息
比如之前的-F
参数可以使用BEGIN来设置
echo -e "a-b-c" |awk 'BEGIN{FS="-"} /^a/{print $0}' #设置分割符为-
echo -e "a-b-c" |awk 'BEGIN{FS="-";print "this title::"} {print $0}' #设置输出的首行标题
echo -e "1122\n3344" |awk 'BEGIN{FIELDWIDTHS="2 2";} {print $1,$2}' #固定字段宽度 (mac os中测试失败)
#输出
#11 22
#33 44
内置变量
FS字段分隔符
FIELDWIDTHS指定字段宽度
ORS指定输出的行分隔符
if逻辑处理
awk还可以支持函数和复杂的逻辑处理,完全可以在里面定义函数 调用 判断
例子:
显示红色error
绿色seccess
白色log
echo -e 'success\nerror\nsuccess\nloginfo' | awk \
'{
if (/error/) {
print "\033[91m" $0 "\033[0m"
} else if (/success/){
print "\033[32m" $0 "\033[0m";
}else{
print $0
}
next;
}'
上面语句有换行的段落方便阅览。一行简写也是可以
例子:
判断值大小
echo -e '12\n14\n232\n90' |awk '{if($0>=90) print $0}' #输出>=90的数据
#232
#90
for循环
使用for循环计算求和
echo '5' |awk '{ \
total = 0
for (var = 1; var < $0; var++)
{
total += var
}
print "total:",total
}'
Built-In Functions函数使用
awk中语义中支持函数的使用
echo -e 'H htjim\nDot\ncom\n009' |awk '{print toupper($0)}'#转换为大写
内置函数
toupper 转换为大写
tolower 转换为小写
rand 随机数
其他函数参考手册:
https://www.gnu.org/software/gawk/manual/html_node/Built_002din.html#Built_002din
自定义函数
自定义彩色文字输出函数awk内部执行调用
echo -e 'success\nerror\nsuccess\nloginfo' | awk \
'
function red(s) {
printf "\033[1;31m" s "\033[0m "
}
function green(s) {
printf "\033[1;32m" s "\033[0m "
}
function blue(s) {
printf "\033[1;34m" s "\033[0m "
}
{
if (/error/) {
print red($0)
} else if (/success/){
print green($0)
}else{
print blue($0)
}
}'
其他例子
结合tail -f log
显示红色报错提示
tail -f test.log | awk '{
if (/success/) {
print "\033[91m" $0 "\033[0m"
} else {
print "\033[32m" $0 "\033[0m";
}
next;
}';
next
用于直接跳到下一行文本进行执行 有点continue
的意思
参考:
https://likegeeks.com/awk-command/
http://www.ruanyifeng.com/blog/2018/11/awk.html
https://www.cnblogs.com/Linuxprobe/p/5745381.html
作者:matrix
发布时间:2019年10月19日星期六
分类:command Linux
今天看到2>&1
和>/dev/null 2>&1
有点相似但又完全不同,一直都是CV方式来使用 仅知道后者用于禁止所有输出信息。
简单整理笔记
基本操作符号和数字描述符号
>
用于输出覆盖内容,>>
用于输出追加内容
<
用于输入,<<
用于设置输入结束符号
<<end
:表示当输入end
的时候结束输入操作
/dev/null
表示Linux中的空设备,也当是数据黑洞,无限吞噬。
类型 |
文件描述符 |
默认情况 |
对应文件句柄位置 |
标准输入(standard input) |
0 |
从键盘获得输入 |
/proc/self/fd/0 |
标准输出(standard output) |
1 |
输出到屏幕(即控制台) |
/proc/self/fd/1 |
错误输出(error output) |
2 |
输出到屏幕(即控制台) |
/proc/self/fd/2 |
输出内容重定向
command >/dev/null 2>&1
这样执行就不会有任何信息显示和保存
补充命令之后:
command 1>/dev/null 2>&1
说明:
>/dev/null
等同于1>/dev/null
意思是 当前控制台的信息输出到空设备。
2>&1
使用&
符号将2重定向绑定到1,意思是将错误信息指向控制台,而这个时候的控制台又指向了空设备。
如果去掉&
符号的2>1
会导致错误信息输出到文件名为1
里面。
linux执行命令时会按顺序从左到右读取来确定0,1,2这三个输入输出的位置。
command 2>&1 >/dev/null
把两个重定向的位置写反之后就是完全不同的意思。
等同于command 2>&1 1>/dev/null
linux执行命令到2>&1
会将错误输出指向1即控制台,到这里就会完成错误输出(2)的位置确定。也就不会更改了。
执行到1>/dev/null
会将标准输出(1)指向空设备,而此时的错误输出(2)已经确定位置了就不会发生更改。
所以最终错误信息显示到控制台,正常信息不会看到。
参考:
https://blog.csdn.net/zhaominpro/article/details/82630528
https://www.cnblogs.com/ultranms/p/9353157.html
https://blog.csdn.net/wz947324/article/details/80005224