scp、ssh、sshpass命令
scp 命令
Linux scp 命令用于Linux之间复制文件和目录。 scp 是secure copy 的缩写,scp 是linux系统下基于ssh登录进行安全的远程文件拷贝命令。scp是加密的,rcp是不加密的,scp是rcp的加强版。
语法
root@node02:~
usage: scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 ... [[user@]host2:]file2
简易写法
scp [可选参数] file_source file_target
参数说明
- -1: 强制scp命令使用协议ssh1。
- -2: 强制scp命令使用协议ssh2。
- -4: 强制scp命令只使用IPv4寻址。
- -6: 强制scp命令只使用IPv6寻址。
- -B: 使用批处理模式(传输过程中不询问传输口令或短语)。
- -C: 允许压缩 (将-C标志传递给ssh,从而打开压缩功能)。
- -p: 保留源文件的修改时间,访问时间和访问权限。
- -q: 不显示传输进度条。
- -r: 递归复制整个目录。
- -v: 详细方式显示输出。scp和ssh(1)会显示出整个过程的调式信息。这些信息用于调试连接,验证和配置问题。
- -c cipher:以cipher将数据传输进行加密,这个选项将直接传递给ssh。
- -F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
- -i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
- -l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
- -o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式
- -P port: 注意是大写的P, port是指定数据传输用到的端口号
- -S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
1、从本地复制文件到远程
命令格式:
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
- 第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;
- 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;
应用实例1:
scp local_file remote_username@remote_ip:remote_folder
root@node01:~
kube1.20.0.tar.gz kubeadm-join-config.yaml kuboard
root@node01:~
The authenticity of host '192.168.37.32 (192.168.37.32)' can't be established.
ECDSA key fingerprint is SHA256:aei51K1iTTFhwmStktny+BugT1giW9eKkdCrI5DgPww.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.37.32' (ECDSA) to the list of known hosts.
root@192.168.37.32's password:
Permission denied, please try again.
root@192.168.37.32's password:
Permission denied, please try again.
root@192.168.37.32's password:
root@192.168.37.32: Permission denied (publickey,password).
lost connection
之所以会出现上面的权限拒绝是因为我装的虚拟机是ubuntu18.04默认情况下禁止root用户远程登录,在/etc/ssh/sshd_config 文件中,有这么一行 # PermitRootLogin prohibit-password, 我们把该去掉注释同时修改为 PermitRootLogin yes ,然后重启sshd服务。
root@node02:/etc/ssh
PermitRootLogin yes
root@node02:/etc/ssh
root 16128 1240 0 06:40 ? 00:00:01 sshd: cntsp [priv]
cntsp 16272 16128 0 06:40 ? 00:00:00 sshd: cntsp@pts/0
root 16273 1240 0 06:40 ? 00:00:00 sshd: cntsp [priv]
cntsp 16374 16273 0 06:40 ? 00:00:00 sshd: cntsp@notty
root 16469 16378 0 07:53 pts/0 00:00:00 grep --color=auto sshd
root@node02:/etc/ssh
root@node02:/etc/ssh
root 16128 1 0 06:40 ? 00:00:01 sshd: cntsp [priv]
cntsp 16272 16128 0 06:40 ? 00:00:00 sshd: cntsp@pts/0
root 16273 1 0 06:40 ? 00:00:00 sshd: cntsp [priv]
cntsp 16374 16273 0 06:40 ? 00:00:00 sshd: cntsp@notty
root 16494 16378 0 07:54 pts/0 00:00:00 grep --color=auto sshd
我在上面sshd进程前加了 突出对比由于我们重启了sshd服务,进程id变了
再次尝试scp拷贝命令
root@node01:~
root@192.168.37.32's password:
Permission denied, please try again.
root@192.168.37.32's password:
Permission denied, please try again.
root@192.168.37.32's password:
kubeadm-join-config.yaml 100% 377 24.0KB/s 00:00
之所以前两次输入密码,显示权限拒绝,是因为我没有给192.168.37.32机器的root用户设置密码
root@node02:/etc/ssh
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
再次执行scp拷贝命令
一般工作中,我们都是拷贝到远程机器的普通用户的家目录下,root用户是被禁止远程登录的
应用实例2:
scp local_file remote_username@remote_ip:remote_file
应用实例3:
scp local_file remote_ip:remote_folder
应用实例4:
scp local_file remote_ip:remote_file
2、从远程复制到本地
从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可:
发散点:上面都是有一个需要我们输入命令的过程,如果我们这个拷贝过程是写在shell脚本中自动执行完成的,不需要和我进行一个交互。我应该如何做呢?接着往下看哦!
ssh 命令
SSH 为Secure Shell 的缩写,SSH为创建在应用层和传输层基础上的安全协议。
SSH(远程连接工具[客户端命令])连接原理:ssh服务是一个守护进程(daemon),系统后台监听客户端 /usr/bin/ssh 的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(默认监听在22端口),包括公共密钥等交换信息。
ssh服务端由2部分组陈: openssh(提供ssh服务) openssl(提供加密的程序)
ssh的客户端图形化工具有: xshell、securecrt、Mobaxterm等
root@node01:~
ssh: /usr/bin/ssh /etc/ssh /usr/share/man/man1/ssh.1.gz
root@node01:~
root 1384 1 0 15:10 ? 00:00:00 /usr/sbin/sshd -D
root@node01:~
sshd: /usr/sbin/sshd /usr/share/man/man8/sshd.8.gz
传统的网络服务程序,如FTP、POP和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。
而SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
SSH之另一项优点为其传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。
1、远程登录及执行命令
直接执行命令
远程sudo命令
root@node01:~
cntsp@192.168.37.32's password:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-08-21 08:02:36 UTC; 5h 9min ago
Process: 16707 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 16713 (sshd)
Tasks: 1 (limit: 2287)
CGroup: /system.slice/ssh.service
└─16713 /usr/sbin/sshd -D
Aug 21 11:44:10 node02 sshd[17748]: pam_unix(sshd:session): session opened for user root by (uid=0)
Aug 21 11:45:53 node02 sshd[17862]: Accepted password for root from 192.168.37.31 port 47776 ssh2
Aug 21 11:45:53 node02 sshd[17862]: pam_unix(sshd:session): session opened for user root by (uid=0)
Aug 21 11:49:20 node02 sshd[17975]: Accepted password for root from 192.168.37.31 port 48290 ssh2
Aug 21 11:49:20 node02 sshd[17975]: pam_unix(sshd:session): session opened for user root by (uid=0)
Aug 21 11:49:21 node02 sshd[17975]: Received disconnect from 192.168.37.31 port 48290:11: disconnected by user
Aug 21 11:49:21 node02 sshd[17975]: Disconnected from user root 192.168.37.31 port 48290
Aug 21 11:49:21 node02 sshd[17975]: pam_unix(sshd:session): session closed for user root
Aug 21 13:11:45 node02 sshd[18571]: Accepted password for cntsp from 192.168.37.31 port 60396 ssh2
Aug 21 13:11:45 node02 sshd[18571]: pam_unix(sshd:session): session opened for user cntsp by (uid=0)
root@node01:~# ssh cntsp@192.168.37.32 hostname
cntsp@192.168.37.32's password:
node02
root@node01:~
cntsp@192.168.37.32's password:
sudo: no tty present and no askpass program specified
root@node01:~# ssh -t cntsp@192.168.37.32 sudo systemctl status sshd
cntsp@192.168.37.32's password:
[sudo] password for cntsp:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-08-21 08:02:36 UTC; 5h 12min ago
Process: 16707 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 16713 (sshd)
Tasks: 1 (limit: 2287)
CGroup: /system.slice/ssh.service
└─16713 /usr/sbin/sshd -D
Aug 21 13:11:45 node02 sshd[18571]: pam_unix(sshd:session): session opened for user cnts
Aug 21 13:11:47 node02 sshd[18571]: pam_unix(sshd:session): session closed for user cnts
Aug 21 13:12:28 node02 sshd[18704]: Accepted password for cntsp from 192.168.37.31 port
Aug 21 13:12:28 node02 sshd[18704]: pam_unix(sshd:session): session opened for user cnts
Aug 21 13:12:29 node02 sshd[18704]: pam_unix(sshd:session): session closed for user cnts
Aug 21 13:12:45 node02 sshd[18790]: Accepted password for cntsp from 192.168.37.31 port
Aug 21 13:12:45 node02 sshd[18790]: pam_unix(sshd:session): session opened for user cnts
Aug 21 13:12:46 node02 sshd[18790]: pam_unix(sshd:session): session closed for user cnts
Aug 21 13:15:27 node02 sshd[18878]: Accepted password for cntsp from 192.168.37.31 port
Aug 21 13:15:27 node02 sshd[18878]: pam_unix(sshd:session): session opened for user cnts
lines 1-19/19 (END)
sshpass命令
上面我测试不管是scp命令还是ssh命名执行过程中都有交互需要我输入用户密码,我想把输入密码这个步骤也放到命令中执行执行,不需要人工交互,因为在我们执行一些脚本登录远程主机部署服务的时候是自动执行的。尽量不要人工交互。尤其在jenkins中在job中执行一些脚本时,有时你脚本中执行的内容是在本slave节点上,有时你的job是需要到远程机器上执行的,这时候就是slave节点需要登录远程机器部署执行该脚本。这个job是在后台运行的,虽然我们可以在jenkins前端页面输出控制台看到执行细节,但是是没有人工交互的。那么sshpass命令可以直接在命令行使用密码来进行远程连接和远程拉取和推送文件。
首先在ubuntu系统安装sshpass软件
apt install -y sshpass
1、直接远程连接某台主机
2、本地执行远程机器的命令
root@node01:~
node02
3、远程连接指定ssh的端口
sshpass -p passwd ssh -p 10000 root@192.168.37.32
4、从远程主机拉取文件到本地
|