shell & ssh

# 日常用到的Shell命令

命令名 功能描述
clear 清除屏幕或窗口内容
env 显示当前所有设置过的环境变量
date 显示系统的当前日期和时间
cal 显示日历
vi 修改文件 dd删除一行 A编辑选中的最后一行代码 ,
:set nu 加索引
touch 创建文件
mkdir 创建文件夹
du -ha [文件名称] 查看目录/文件占用空间大小
ls -lh 看文件大小
ll 等价 ls -al
netstat -nltp grep 443
mv 修改文件名 移动文件 mv index.html .bash_profile
cat 查看内容
sudo vim /etc/hosts ws破解
ssh -p 2289 root@182.92.117.162 登录ssh
chattr +i .user.ini 重新恢复文件不可更动属性
chmod -R 777 pet_07 赋权限
r:可读
w:可写
x:可执行

-rw------- (600) -- 只有属主有读写权限。
-rw-r--r-- (644) -- 只有属主有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) -- 只有属主有读、写、执行权限。
-rwxr-xr-x (755) -- 属主有读、写、执行权限;别的用户组只有读、执行权限。
-rwx--x--x (711) -- 属主有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) -- 所有用户都有文件读、写权限。这种做法不可取。
-rwxrwxrwx (777) -- 所有用户都有读、写、执行权限。更不可取的做法。
参数解释
sudo chown -R $(whoami) or【你的用户名】 /Users/hzf/Desktop/projectSvelte 更改某个目录或文件的用户名和用户组
yarn version --new-version 1.0.0 更改版本号
curl http://www.jing999.cn:8000/banner http命令行工具
ping www.jing999.cn ping
kill -9 PID 杀死这个进程
npx browser-sync start -s . -f . 静态页面动态刷新
browser-sync start --server --files . 静态页面动态刷新
rm -rf node_modules/.cache/babel-loader umi的bug
nginx -s reload 重启nginx
tar -czvf dist.tar.gz dist dist 压缩
tar -xzvf dist.tar.gz 解压
-c: 建立压缩档案
-x:解压
-z:有gzip属性的
-v:显示所有过程
-r:向压缩归档文件末尾追加文件
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
参数解释
find / -name jenkins 查看安装目录
find . "(" -name ".m" -or -name ".mm"
-or -name ".jsx" -or -name ".tsx"
-or -name ".css" -or -name ".less"
-or -name ".scss" -or -name ".js"
-or -name ".ts" -or -name ".rss" ")" -print | xargs wc -l
看一共写了多少行的代码
sed -i '' "s/666/777/g" config 修改文字 666换成777

# 添加环境变量

  • 临时有效
    • export PATH=$(pwd)/bin:$PATH
  • 软连接 /usr/local/bin/就是环境变量目录
    • ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
  • 用户主目录下的.bashrc 或.profile文件(推荐)
    • export PATH=/Users/hzf/mongodb/bin:$PATH
      • 执行source ~/.bashrc, 立即生效

# VIM

批量注释

从需要被注释的第一行开始,将光标移动到行首,

按下 Ctrl + v

接着按下方向键下,一直移动到需要被注释的最后一行,

这时可以看到,这些需要被注释的行的行首第一个字符已经全部被选中

然后按下 Shift + i,批量插入,

这时光标会跳到第一行的行首,不用管,继续按下Shift + 3,也就是 #

最后按下 Esc 键,就可以看到刚才被选中的行的行首都会加多一个#

批量注释完毕

去注释

对于一大段被注释的代码,需要去掉注释的时候,也可以一次性操作完

不用一个一个去删,具体操作如下:

光标移到需要去除注释的第一行的行首,跟上面的一样,

按下 ·Ctrl + v

接着按下方向键下,一直移动到需要被注释的最后一行,

这时候可以看到,行首的第一个字符#已经被选中了,

然后按下d键就可以全部删掉行首的#字符了。

# Shell编程

# run: sh depoly.sh 123 123
# 变量定义
str='test' # 注意赋值不需要空格
str2="this is $str" # 双引号可以直接写入变量
str3="this is ${str}"
arr=('1' '2') # 数组

# echo打印
echo this is test # this is test # 被默认为字符串,不会报错
echo $str # test # 变量引用需要家$符号
echo $str2 # this is test
echo $str3 # this is test
echo ${arr[1]} # 2 # 数组切割

# if判断
if [ $str == "test" ] # if条件需要在方括号中,并且注意需要空格
then
    echo 'successed'
fi

a='10'
b='20'
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

# 获取参数
echo $1 # 123 #第一个参数
echo $# # 2 # 参数个数
echo $* # 123 123 所有参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 针对jenkins总结的

启动jenkins
java -jar jenkins.war --httpPort=8081

如果想要在linux后台一直运行,则要开始加nohup,在末尾加&号
nohup java -jar jenkins.war --httpPort=8081 &

启动后 会生成一个nohup.out输出,需要的话,可以tail -f nohup.out实时查看日志

列出jenkins的所有进程
ps -aux|grep jenkins

杀死这个进程
kill -9 [PID]

启动jenkins的另外方式
service jenkins start/stop/restart/status

systemctl start jenkins.service

查看运行的后台进程
jobs -l
jobs命令只看当前终端生效的,关闭终端后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)
ps -ef
ps -aux|grep jenkins

查看使用某端口的进程
lsof -i:3000
kill -9 [pid]

# ssh 不能登录服务器

提示警告信息如下:

arnold@WSN:~$ ssh 120.79.229.197

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is 08:98:a9:cc:f8:37:20:6b:b4:b1:6c:3a:15:b9:a9:92. Please contact your system administrator. Add correct host key in /home/arnold/.ssh/known_hosts to get rid of this message. Offending key in /home/arnold/.ssh/known_hosts:2 RSA host key for 10.18.46.111 has changed and you have requested strict checking. Host key verification failed.

原因分析:

It is also possible that a host key has just been changed.

我之前对ssh服务器重装了系统,导致所有与原系统建立过ssh连接的系统都无法再建立连接,因为在于原系统建立首次连接时,双方相互记录了对方的公钥(ssh基于非对称密钥技术),在ssh服务主机重装系统后,公钥改变了,任以旧版本公钥的主机自然是无法与新系统连接的。

网上还有分析为ssh主机被人黑了,并在消除入侵记录时对known_hosts文件做了改动。当然也不排除这种可能,但我估计我是没那个福气了:)

解决方案:

删除 ~/.ssh/known_hosts文件,或者如果你可以判断出known_hosts中原ssh服务器的公钥,删去那部分

然后后再次建立新的连接,即可获得新的公钥。

# 关于sshpass使用举例

使用-p参数指定登录密码

# 免密码登录
$ sshpass -p password ssh username@host

# 远程执行命令
$ sshpass -p password ssh username@host <cmd>

# 通过scp上传文件
$ sshpass -p password scp local_file root@host:remote_file 

# 通过scp下载文件
$ sshpass -p password scp root@host:remote_file local_file
1
2
3
4
5
6
7
8
9
10
11

示例:


 


 







#把本地的source.txt文件拷贝到192.168.0.10机器上的/home/work目录下
scp /home/work/source.txt root@192.168.0.10:/home/work/ 

#把120.79.229.197机器上的hzf.gif文件拷贝到本地的/Users/zhenfeng/tempData/目录下
scp root@120.79.229.197:/tmp/hzf.gif /Users/zhenfeng/tempData/  

#把192.168.0.10机器上的source.txt文件拷贝到192.168.0.11机器的/home/work目录下
scp root@192.168.0.10:/home/work/source.txt root@192.168.0.11:/home/work/ 

#拷贝文件夹,加-r参数
scp -r /home/work/sourcedir root@192.168.0.10:/home/work/ 
1
2
3
4
5
6
7
8
9
10
11

# 脚本

#!/usr/bin/env bash
tar -czvf '$1' | sshpass -p password ssh root@host 'cd /home -rf;tar -xzvf -'
1
2

脚本用env启动的原因,是因为脚本解释器在linux中可能被安装于不同的目录,env可以在系统的PATH目录中查找。同时,env还规定一些系统环境变量。