wget
概述
wget是一个下载文件的工具,用在命令行下
,下载一些软件或从远程服务器恢复备份到本地服务器
wget支持HTTP,HTTPS和FTP协议,可以使用HTTP代理
支持自动下载
- wget可以在用户退出系统的之后在后台执行。
- 意味着你可以登录系统,启动一个wget下载任务,然后退出系统,
wget将在后台执行直到任务完成
,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,优点便比较明显
非常稳定
- 在带宽很窄的情况下和不稳定网络中有很强的适应性
- 如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕
- 如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载
使用
命令格式:
wget [参数] [URL地址]
从网络上下载资源,没有指定目录,下载资源回默认为当前目录
下载单个文件
从网络下载一个文件并保存在当前目录
,在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。
wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip
限速下载
执行wget的时候,它默认会占用全部可能的宽带下载。但是当你准备下载一个大文件
,而你还需要下载其它文件时就有必要限速了
wget --limit-rate=300k http://www.minjieren.com/wordpress-3.1-zh_CN.zip
后台下载
对于下载非常大的文件的时候,我们可以使用参数-b进行后台下载
wget -b http://www.minjieren.com/wordpress-3.1-zh_CN.zip
使用以下命令来察看下载进度
tail -f wget-log
下载文件增加重试次数
如果网络有问题或下载一个大文件也有可能失败。wget默认重试20次连接下载文件
。如果需要,你可以使用–tries增加重试次数。
wget --tries=40 URL
下载多个文件
首先,保存一份下载链接的文件
cat filelist.txt
url1
url2
url3
url4
然后使用下面的命令
wget -i filelist.txt
把下载信息存入日志文件
wget -o download.log URL
下载并以不同的文件名保存
wget默认会以最后一个符合”/”的后面的字符来命令,对于动态链接的下载通常文件名会不正确
- 如果直接下载,如下,会保存为:download.aspx?id=1080
wget http://www.minjieren.com/download.aspx?id=1080
下载并以wordpress.zip名称保存
wget -O wordpress.zip URL
ssh
概述
ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。
ssh服务端由2部分组成:
- openssh(提供ssh服务)
- openssl(提供加密的程序)
命令格式
ssh [OPTIONS] [-p PORT] [USER@]HOSTNAME [COMMAND]
工作机制
流程:
- 服务器启动的时候自己产生一个密钥(768bit公钥),
- 本地的ssh客户端发送连接请求到ssh服务器,
- 服务器检查连接点客户端发送的数据和IP地址,确认合法后发送密钥(768bits)给客户端,
- 此时客户端将本地私钥(256bit)和服务器的公钥(768bit)结合成密钥对key(1024bit),发回给服务器端,建立连接通过key-pair数据传输。
图解: - 远程Server收到Client端用户TopGun的登录请求,Server把自己的公钥发给用户。
- Client使用这个公钥,将密码进行加密。
- Client将加密的密码发送给Server端。
- 远程Server用自己的私钥,解密登录密码,然后验证其合法性。
- 若验证结果,给Client相应的响应
使用
指定用户名和端口登录远程主机
ssh -p3600 root@xx.xx.xxx.xx
命令enter后,再输入用户登录密码后完成登录
ssh 实现免密登录
流程
登录流程如下
流程:
- 在客户端使用 ssh-keygen 生成一对密钥:公钥+私钥;
- 将客户端公钥追加到服务端的 authorized_key 文件中,完成公钥认证操作;
- 认证完成后,客户端向服务端发起登录请求,并传递公钥到服务端;
- 服务端检索 authorized_key 文件,确认该公钥是否存在。如果存在该公钥,则生成随机数 R,并用公钥进行加密,生成公钥加密字符串 pubKey®;
- 将公钥加密字符串传递给客户端;
- 客户端使用私钥解密公钥加密字符串,得到 R;
- 服务端和客户端通信时会产生一个会话 ID(sessionKey),用 MD5 对 R 和 SessionKey 进行加密,生成摘要;
- 客户端将生成的 MD5 加密字符串传给服务端;
- 服务端同样生成 MD5(R,SessionKey) 加密字符串;
- 如果客户端传来的加密字符串等于服务端自身生成的加密字符串,则认证成功。此时不用输入密码,即完成建连,可以开始远程执行 Shell 命令了。
实现
第一步:使用 ssh-keygen 命令在客户端生成 RSA 公钥和私钥,一直回车确认。公钥和私钥默认名称为 id_rsa.pub(公钥)和私钥(id_rsa),默认保存在 ~/.ssh 目录下
。
ssh-keygen -t rsa
第二步:将客户端公钥追加至服务端 ~/.ssh/authorized_keys 文件中,authorized_keys 是用来存放客户端公钥的文件。有三种方法
- 通过 ssh-copy-id 命令
- 通过 scp 命令
- 手动复制
使用 ssh-copy-id 命令实现如下
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 3600 root@xx.xx.xxx.xx
第三步:使用 ssh 进行免密登录
ssh -p3600 root@xx.xx.xxx.xx
scp
概述
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令
- 类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器
- scp传输是加密
- scp还非常不占资源,不会提高多少系统负荷,基本不影响系统正常使用。
命令格式:
scp [参数] [原路径] [目标路径]
使用
从本地服务器复制到远程服务器
复制文件
# 指定了用户名,命令执行后需要输入用户密码
# 仅指定了远程的目录,文件名字不变
scp local_file remote_username@remote_ip:remote_folder
# 指定了文件名
scp local_file remote_username@remote_ip:remote_file
# 没有指定用户名,命令执行后需要输入用户名和密码
# 仅指定了远程的目录,文件名字不变
scp local_file remote_ip:remote_folder
# 指定了文件名
scp local_file remote_ip:remote_file
复制目录
# 指定了用户名,命令执行后需要输入用户密码
scp -r local_folder remote_username@remote_ip:remote_folder
# 没有指定用户名,命令执行后需要输入用户名和密码
scp -r local_folder remote_ip:remote_folder
从远程服务器复制到本地服务器
从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。
注意
如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号,命令格式如下:
#scp 命令使用端口号 4588
scp -P 4588 remote@www.runoob.com:/usr/local/sin.sh /home/administrator
使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的。
sh
概述
sh命令 是shell命令语言解释器,执行命令从标准输入读取或从一个文件中读取
语法格式:
sh [参数] 脚本
常用参数
使用
执行指定的脚本文件
[root@xx~]# sh xx.sh
/root
21:33:45 up 42 min, 1 user, load average: 0.06, 0.01, 0.00
执行指定的脚本文件,并逐条命令进行追踪
[root@xx ~]# sh -x xx.sh
+ pwd
/root
+ uptime
21:33:50 up 42 min, 1 user, load average: 0.05, 0.01, 0.00
实例:jar包在linux系统上的shell运行脚本
启动: ./xxx.sh start
停止: ./xxx.sh stop
重启: ./xxx.sh restart
#!/bin/bash
############################### 参数区start ########################################
source ./00-set-vars.sh
#指定jdk1.8路径 /home/devSoft/jdk1.8.0_77/bin/java || java
JDK_HOME=$JAVA_HOME
#指定注册中心,多个注册中心,使用逗号分隔
EUREKA_SERVER=$EUREKA_CENTER
#指定jar包名称
JAR_NAME=jar包名称.jar
#指定程序端口号
SERVER_PORT=26069
OTHER_PARAM="指定参数,以--开头,多个参数中间空格,参考: --zuul.routes.web-crud-demo.path=/web-crud-demo/** --zuul.routes.web-crud-demo.url=http://1localhost:8080 --zuul.routes.web-crud-demo.stripPrefix=false --zuul.routes.web-crud-demo.custom-sensitive-headers=true"
############################### 参数区end ##########################################
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 脚本名.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $SERVER_PORT-$JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${SERVER_PORT}-${JAR_NAME} is already running. pid=${pid} ."
else
nohup $JDK_HOME -Xms64m -Xmx512m -D$SERVER_PORT-$JAR_NAME -jar $JAR_NAME --server.port=$SERVER_PORT $OTHER_PARAM --eureka.client.serviceUrl.defaultZone=$EUREKA_SERVER >/dev/null 2>&1 &
echo "nohup ${JDK_HOME} -D${SERVER_PORT}-${JAR_NAME} -jar ${JAR_NAME} --server.port=${SERVER_PORT} ${OTHER_PARAM} --eureka.client.serviceUrl.defaultZone=$EUREKA_SERVER >/dev/null 2>&1 & ."
echo "${SERVER_PORT}-${JAR_NAME} start success"
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${SERVER_PORT}-${JAR_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${SERVER_PORT}-${JAR_NAME} is running. Pid is ${pid}"
else
echo "${SERVER_PORT}-${JAR_NAME} is NOT running."
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac