autossh自动输入密码且断线重连

作者: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

awk入门小记

作者:matrix 发布时间:2019年11月6日星期三 分类:command Linux

图片5055-awk入门小记

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

记linux输出重定向操作>&

作者: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

linux查找maildrop目录超大空间占用

作者:matrix 发布时间:2019年9月20日星期五 分类:Linux

线上centos服务器有很长时间没有连,今天安装证书无故失败,数据库也不能连接。。。一系列的问题

查找占用情况

$ df -h #查看磁盘占用情况
$ du -h --max-depth=1 ./ #查看当前目录的文件/目录占用大小

然后就是手动一层一层的找到最大的那个目录。 😂
最后找到一个隐藏杀手:/var/spool/postfix/maildrop/。这个目录下面存在3000W个小文件,占用33GB。主要它还不是tmp之类的目录,没遇见过真是很难查找。

究其原因是crontab任务日志发送到所有者的邮箱导致的问题

解决方案

  • 方法1

编辑crontab顶部首行写上 MAILTO="",这样就会把邮箱信息赋空,也就不会发送了。

图片5030-linux查找maildrop目录超大空间占用

如果有非root用户的crontab任务也需要在顶部声明MAILTO="".
默认crontab -e是编辑的当前登录的用户定时任务配置,若是以root登录则为/var/spool/cron/root
同理www用户的定时任务文件就是/var/spool/cron/www

  • 方法2

其次就是每条cron任务的最后把输出信息赋空 >/dev/null 2>&1

* * * * * /root/do.sh >/dev/null 2>&1

p.s.

记下以后排查的顺序

  1. web程序日志
  2. nginx/apache日志
  3. tmp
  4. crontab 错误邮件发送日志
    /var/spool/postfix/maildrop
  5. /var/log 类型的log目录
    /var/log/journal 启动目录的文件很多
    ...

参考:
https://www.jianshu.com/p/a0aa43707476
https://my.oschina.net/qimhkaiyuan/blog/1631028

acme.sh配置泛域名证书Let'sEncrypt

作者:matrix 发布时间:2019年9月18日星期三 分类:Linux

环境:
阿里云centos + dnspod.cn

acme.sh项目:https://github.com/Neilpang/acme.sh

安装

$ curl  https://get.acme.sh | sh

图片5018-使用acme.sh配置泛域名证书Let'sEncrypt
出现Install success!安装成功。

dns验证方式-获取域名dns token

这里使用域名解析服务商的token来进行域名拥有验证
在dnspod.cn上操作申请获取ID和token。
ssh执行命令设置变量,便于后面脚本读取。

$ export DP_Id="000000"
$ export DP_Key="26****************************ed"

阿里云dns:

$ export Ali_Id="000000"
$ export Ali_Key="26****************************ed"

阿里云dns获取api和key:https://usercenter.console.aliyun.com/#/manage/ak 进去申请AccessKey ID与Access Key Secret就好。

其他域名解析商的api token操作:
https://github.com/Neilpang/acme.sh/wiki/dnsapi

申请泛域名证书

为域名hhtjim.com申请证书。

$ source .bashrc #执行资源更新 确保acme.sh别名可用
$ acme.sh --issue --dns dns_dp -d hhtjim.com -d *.hhtjim.com

说明:
dns_dp 为dnspod ,如果是阿里云dns则为 dns_ali
前面-d参数指定根域名,后面-d指定子级泛域名
.hhtjim.com的证书只能支持通配符当前级别的域名,也就是xxx.hhtjim.com
如果要三级子域名就需要单独申请:
.xxx.hhtjim.com,参数为-d xxx.hhtjim.com -d *.xxx.hhtjim.com

执行之后等待几分钟出现绿色文字提示key,cer证书所在位置就酸完成了。

图片5019-使用acme.sh配置泛域名证书Let'sEncrypt

The domain key is here: /root/.acme.sh/hhtjim.com/hhtjim.com.key

Your cert is in  /root/.acme.sh/hhtjim.com/hhtjim.com.cer 
Your cert key is in  /root/.acme.sh/hhtjim.com/hhtjim.com.key 
The intermediate CA cert is in  /root/.acme.sh/hhtjim.com/ca.cer 
And the full chain certs is there:  /root/.acme.sh/hhtjim.com/fullchain.cer

证书生成完成,使用的时候把证书移动到nginx配置相关目录。

nginx证书使用

server {
    listen 443;
    server_name www.hhtjim.com;
    root /htdocs/www.hhtjim.com;
    index index.html index.htm index.php;
    ssl on;

    ssl_certificate /certificate_file_PATH/hhtjim.com/fullchain.cer;
    ssl_certificate_key /certificate_file_PATH/hhtjim.com/hhtjim.com.key;
    ...

ssl_certificate和ssl_certificate_key对应fullchain.cer和域名.key文件即可。
以后的所有子域名都可以使用这个路径的证书。

证书更新

脚本会自行写入crontab

36 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

每天定时检测过期再更新。

参考:

https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E
https://lnmp.org/faq/letsencrypt-wildcard-ssl.html
https://juejin.im/post/5b6542ed51882519d3468d6d

CentOS命令行安装Matlab R2017b

作者:matrix 发布时间:2019年7月26日星期五 分类:Linux

现在应要求需要再服务器端环境安装matlab以进行更好测试达到理想之效果。

测试环境:本地客户端macOS,服务器centOS 需要20GB空余

下载matlab

https://pan.baidu.com/s/1wijZCXIWsNXgz0yYYBXHnQ#提取e8b2

刚开始用mac三方百度客户端进行下载,没有校验文件md5和基本信息就直接对z01,z02进行解压拿到iso镜像文件挂载没问题。浪费时间一上午进行安装出现输入输出错误原因就是iso不完整。

文件哈希:

$ md5sum R2017b_glnxa64.iso
0bbe62e90ba9aaf357c72ef93e81753c  R2017b_glnxa64.iso

若是本地上传到服务器最好使用rsync附加参数-rP --append来进行断点续传,要不然中断之后重新上传简直。。。

开始安装

需要系统有20GB的剩余空间(包含iso文件,mnt挂载空间,程序安装空间)才可安装,我已经尝试过很多遍了😂😂😂

  1. 挂载镜像文件到/mnt
    $ mount -t iso9660 -o loop R2017b_glnxa64.iso文件路径 /mnt
    

    如果挂载有问题可以考虑直接对iso进行解压缩:

    $ sudo yum install p7zip p7zip-plugins 
    $ 7z x ubuntu-16.10-server-amd64.iso
    
  2. 执行安装

    若之前安装中断或者失败需要清空之前的安装数据,否则会报错。
    删除之前安装的文件:rm -rf /usr/local/MATLAB
    还有安装matlab之前java环境不是必须安装,matlab包里面会自带jre。

    $ cd /mnt
    $ sudo ./install -fileInstallationKey 09806-07443-53955-64350-21751-41297 -agreeToLicense yes -mode silent -activationPropertiesFile  MATLABR2017b_Linux_Crack目录中的license_standalone.lic文件路径
    

    说明:
    license_standalone.lic文件路径需自行替换
    09806-07443-53955-64350-21751-41297为install_key.txt中的授权码

    图片4949-CentOS命令行安装Matlab过程

    执行之后就等待安装,若显示要继续 请点击″是″。 要返回″否″。是否仍要继续?这些也不用管。

    安装完成

    最终等待界面出现End - Successful.Finished即表示安装完成。

破解

安装完成之后执行程序/usr/local/MATLAB/R2017b/bin/matlab显示未激活状态

错误: 激活无法继续。您可能需要执行以下任一操作:
 1.设置 X11 显示,然后重新启动激活过程
 2.使用静默激活功能
 3.使用许可证中心激活

执行激活程序/usr/local/MATLAB/R2017b/bin/activate_matlab.sh -propertiesFile /usr/local/MATLAB/R2017b/activate.ini也没有用。

最后拷贝破解文件解决:
进入破解文件license_standalone.lic,libmwservices.so 所在目录

sudo cp license_standalone.lic /usr/local/MATLAB/R2017b/licenses/ 
sudo cp libmwservices.so /usr/local/MATLAB/R2017b/bin/glnxa64/

启动matlab

设置环境变量,避免每次执行/usr/local/MATLAB/R2017b/bin/matlab很麻烦

$ echo 'export PATH=/usr/local/MATLAB/R2017b/bin:$PATH' >> /etc/profile 
$ source /etc/profile

以后输入matlab就可以启动

Matlab启动成功

卸载之前的iso:umount /mnt

若无法卸载参考https://www.cnblogs.com/sisimi/p/7700309.html来强制推出操作。

后台执行.m脚本

安装服务器版本的最终目的其实就是让其后台运行,但是后面测试的时候发现了很多坑。

比如手动执行nohup matlab -nojvm -nodesktop -nodisplay -nosplash -r test.m > ./logfile &
这样会导致日志输出结果出现大量错误warning的提示,我是直接用supervisord来守护进程,避免手动执行nohup操作。

如果你用nohup matlab -nodesktop -nosplash -nodisplay < test.m >logfile这种<形式来调用脚本那就要小心了,因为会出现更多的错误,像Undefined variable com or class com.mathworks.timer.TimerTask都是小事情,然而我这里是提示语法逻辑错误,感觉是脚本文件加载的时候出现字符问题,原因有很多,我这里没有具体进一步测试。我建议还是不要用<这种形式来执行.m脚本。
参考:https://blog.csdn.net/sethinking/article/details/88375995

还有一个就是执行matlab脚本目录的问题,如果像这样直接-r 'run("/root/test.m");' 执行入口脚本test.m很有可能会找不到其中依赖该目录下的自定义函数。建议-r 'cd /root;test;'这种形式来调用。

最终这样调用:

$ matlab  -nodesktop -nodisplay -nosplash -r 'cd /home/script/;main;'  >> /root/matlab_log_`date +"%Y%m%d"`.log

说明:
/home/script/main.m为脚本入口
这里没有使用-nojvm参数,也没有进一步测试我的脚本依赖是否可以不启动。
>> /root/matlab_log_date +"%Y%m%d".log为输出日志,名称为日期年月日

报错整理

  1. ./install:行269: /bin/glnxa64/install_unix: 输入/输出错误
    确保iso镜像文件的完整性,需要知道iso的文件如果缺失一部分也是可以挂载的。😂
    建议在Windows端用winrar点击R2017b_glnxa64.zip执行解压拿到R2017b_glnxa64.iso

  2. archive is not a ZIP archive那就是空间不足的问题。

  3. 若非首次安装出现问题确保把之前的安装的文件都清空了
    删除之前安装的文件:rm -rf /usr/local/MATLAB

  4. 出现libXt.so。。。Creating local MVM错误

    MATLAB is selecting SOFTWARE OPENGL rendering.
    Unrecognized MATLAB option "version".
    Fatal Internal Error: Unexpected exception: 'N5boost16exception_detail10clone_implINS0_39current_exception_std_exception_wrapperISt13runtime_errorEEEE: Bundle#2 start failed: libXt.so.6: 无法打开共享对象文件: 没有那个文件或目录' in createMVMAndCallParser phase 'Creating local MVM'
    

    这个问题今天上午才搞定,期间安装了很多包都不起作用。MD!!!
    最终执行安装yum install libXt.x86_64才解决。
    中间我也查看过libXt.so.6这个鬼玩意的确是有的,后面看到因为matlab都需要32位和64位的包,所以这鬼玩意一直报错。
    也有可能再期间安装的一部分包是依赖必须的:

    $ yum list  installed |grep libX
    
    libX11.i686                             1.6.5-2.el7                    @base    
    libX11.x86_64                           1.6.5-2.el7                    @base    
    libX11-common.noarch                    1.6.5-2.el7                    @base    
    libX11-devel.x86_64                     1.6.5-2.el7                    @base    
    libXau.i686                             1.0.8-2.1.el7                  @base    
    libXau.x86_64                           1.0.8-2.1.el7                  @base    
    libXau-devel.x86_64                     1.0.8-2.1.el7                  @base    
    libXdamage.x86_64                       1.1.4-4.1.el7                  @base    
    libXdamage-devel.x86_64                 1.1.4-4.1.el7                  @base    
    libXdmcp.i686                           1.1.2-6.el7                    @base    
    libXext.i686                            1.3.3-3.el7                    @base    
    libXext.x86_64                          1.3.3-3.el7                    @base    
    libXext-devel.x86_64                    1.3.3-3.el7                    @base    
    libXfixes.x86_64                        5.0.3-1.el7                    @base    
    libXfixes-devel.x86_64                  5.0.3-1.el7                    @base    
    libXft.x86_64                           2.3.2-2.el7                    @base    
    libXft-devel.x86_64                     2.3.2-2.el7                    @base    
    libXi.i686                              1.7.9-1.el7                    @base    
    libXi.x86_64                            1.7.9-1.el7                    @base    
    libXmu.i686                             1.1.2-2.el7                    @base    
    libXp.i686                              1.0.2-2.1.el7                  @base    
    libXp.x86_64                            1.0.2-2.1.el7                  @base    
    libXrender.x86_64                       0.9.10-1.el7                   @base    
    libXrender-devel.x86_64                 0.9.10-1.el7                   @base    
    libXt.i686                              1.1.5-3.el7                    @base    
    libXt.x86_64                            1.1.5-3.el7                    @base    
    libXtst.i686                            1.2.3-1.el7                    @base    
    libXtst.x86_64                          1.2.3-1.el7                    @base    
    libXxf86vm.x86_64                       1.1.4-1.el7                    @base    
    libXxf86vm-devel.x86_64                 1.1.4-1.el7                    @base 
    

    这里整理一份本机已安装所有libX开头的包,自行取舍。

  5. 大量报错信息 Bad file descriptor 和 Warning: "Error reading character from command line"

参照上面后台执行.m脚本修改命令行调用的方式,去除nohup。使用supervisord工具来守护进程,亦或者不要输出日志。

参考:
https://blog.csdn.net/qq_32892383/article/details/79670871

https://ww2.mathworks.cn/matlabcentral/answers/131366-why-do-i-see-i-o-errors-when-installing-matlab-using-the-iso-image

https://ww2.mathworks.cn/matlabcentral/answers/98745-why-do-i-receive-an-error-message-archive-is-not-a-zip-archive-during-matlab-installation-on-Linux

https://www.jianshu.com/p/a10397fcfb1d

https://blog.csdn.net/Xiao_Song_PKU/article/details/82700228

https://www.cnblogs.com/yaoyaoliu/p/6798463.html

https://linux.cn/article-7992-1.html

https://blog.csdn.net/qq_39187538/article/details/88676283

https://www.cnblogs.com/sisimi/p/7700309.html

https://www.centos.org/forums/viewtopic.php?t=31436

https://ww2.mathworks.cn/matlabcentral/answers/63751-how-do-i-get-matlab-running-in-batch-mode-to-only-output-the-results-of-disp-fprintf-etc-and-no

https://ww2.mathworks.cn/matlabcentral/answers/66793-problem-running-matlab-script-to-background

ssh config多账户/多域名配置

作者:matrix 发布时间:2019年6月18日星期二 分类:Linux

测试环境:ubuntu

客户端连接远程ssh/git服务的时候可以在本地配置SSH config,用于简化多参数使用操作或者修改默认的ssh命令使用的配置。

我这里需要使用gitee的ssh密钥来管理远程仓库代码,方便以后可以免密码提交/更新代码。然而本地已经存在一个~/.ssh/id_rsa私钥,且还设置了用来保护私钥的passphrase密码。如果用之前的私钥连接gitee会造成每次都要求输入passphrase密码,亦或不能单独区分使用。
这个问题可以使用配置文件~/.ssh/config来解决

新建新的密钥对

$ ssh-keygen -t rsa -C "user"

新建的时候设置新密钥的保存路径,避免把之前的覆盖掉

配置

config文件默认是不存在的,直接新建即可

$ vi ~/.ssh/config

使用下面配置:

# gitee账户
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rrsa_gitee

说明:
Host类型昵称,可以简化登录的输入地址,比如Host ccl,则可以用ssh ccl直接连接
HostName表示连接的远程主机地址
IdentityFile表示指定私钥文件路径
还有其他参数
Port指定端口
User指定用户名

这种配置可以让ssh来根据远程host地址来使用不同的私钥,设置了User还可以让ssh工具不同用户名来读取配置,也可以使用相同host地址哟~

比如都是github的不同账户,类似配置:

Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/user1_rsa
User user1


Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/user2_rsa
User user2

参考:
https://gitee.com/help/articles/4229
http://vra.github.io/2017/07/09/ssh-config/
https://gitee.com/help/articles/4181
https://daemon369.github.io/ssh/2015/03/21/using-ssh-config-file

PEACE~

ssh/git pull 无密码登录 自动拉取

作者:matrix 发布时间:2019年5月28日星期二 分类:Linux

测试需要S,C两台服务器,我需要C服务器ssh登录到S服务器进行操作。
目的:服务器C端使用命令git pull无密码登录自动从服务器S拉取最新代码。

客户端生成RSA密钥

服务器C属于客户端角色,需要生成本地服务器的rsa密钥对,然后价格公钥发送到服务器S。
登录服务器C

$ cd ~
$ ssh-keygen -t rsa
#后面就默认回车

默认会在 ~/.ssh中生成id_rsa.pub,id_rsa这两个密钥对。

发送公钥

我之前是手动尝试把公钥文本打来粘贴到服务器S,然而ssh登录的话还是要密码验证。测试发现最好是使用ssh-copy-id命令进行操作。
还是在服务器C进行操作

$ ssh-copy-id -i ~/.ssh/id_rsa.pub login_user@HOST -p 22

说明:
ssh-copy-id命令可以快速的将公钥复制到远程主机
-i 指定公钥路径
login_user 为登录的用户名
HOST 为登录的远程服务器S的地址,域名/IP均可
-p 指定服务器S的ssh端口号

命令输入后应该会让你输入login_user用户的密码,若出现and check to make sure that only the key(s) you wanted were added.则表示公钥应该添加成功。
以免出现问题,现在可以去服务器S端看看,指定用户名login_user的文件/home/login_user/.ssh/authorized_keys会有客户端的rsa公钥。

登录测试

在服务器C操作
测试登录:

ssh login_user@HOST -p 22

若登录成功 BINGO!

其他问题

如出现还是需要密码的情况:

1.需要确定/etc/ssh/sshd_config配置文件中是否允许RSAAuthentication

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

2.用户目录权限问题

.ssh父目录的权限是755(我的是/root),.ssh目录权限是700,authorized_keys文件 600

3.确保仓库地址是ssh地址
如果还是https的话就用git remote set-url origin命令修改下:

$ git remote set-url origin git@HOST:user/project.git

参考:
https://blog.csdn.net/alifrank/article/details/48241699
https://blog.csdn.net/chengyuqiang/article/details/78432675
https://blog.csdn.net/b_x_p/article/details/78534423
https://www.cnblogs.com/0xcafebabe/p/5234678.html