linux下 scp 和 ssh 命令

scp、ssh、sshpass命令

scp 命令

Linux scp 命令用于Linux之间复制文件和目录。
scp 是secure copy 的缩写,scp 是linux系统下基于ssh登录进行安全的远程文件拷贝命令。scp是加密的,rcp是不加密的,scp是rcp的加强版。

语法

root@node02:~# scp help
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
# 省略了用户名,默认为root,等同于 scp local_file root@remote_ip:remote_folder
或者
scp local_file remote_ip:remote_file
# 省略了用户名,默认为root,等同于 scp local_file root@remote_ip:remote_file
  • 第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;
  • 第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;

应用实例1:

scp local_file remote_username@remote_ip:remote_folder
root@node01:~# ls
kube1.20.0.tar.gz  kubeadm-join-config.yaml  kuboard
root@node01:~# scp kubeadm-join-config.yaml [email protected]:/root
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.
[email protected]'s password: 
Permission denied, please try again.
[email protected]'s password: 
Permission denied, please try again.
[email protected]'s password: 
[email protected]: Permission denied (publickey,password).
lost connection

之所以会出现上面的权限拒绝是因为我装的虚拟机是ubuntu18.04默认情况下禁止root用户远程登录,在/etc/ssh/sshd_config 文件中,有这么一行 # PermitRootLogin prohibit-password, 我们把该去掉注释同时修改为 PermitRootLogin yes ,然后重启sshd服务。

root@node02:/etc/ssh# cat sshd_config|grep PermitRootLogin
PermitRootLogin yes
# the setting of "PermitRootLogin without-password".
root@node02:/etc/ssh# ps -ef |grep sshd
## root       1240      1  0 Aug20 ?        00:00:00 /usr/sbin/sshd -D
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# systemctl restart sshd
root@node02:/etc/ssh# ps -ef |grep sshd
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      16479      1  0 07:54 ?        00:00:00 /usr/sbin/sshd -D
root      16494  16378  0 07:54 pts/0    00:00:00 grep --color=auto sshd

我在上面sshd进程前加了 突出对比由于我们重启了sshd服务,进程id变了

再次尝试scp拷贝命令

root@node01:~# scp kubeadm-join-config.yaml [email protected]:/root
[email protected]'s password: 
Permission denied, please try again.
[email protected]'s password: 
Permission denied, please try again.
[email protected]'s password: 
kubeadm-join-config.yaml                                                                                                        100%  377    24.0KB/s   00:00    

之所以前两次输入密码,显示权限拒绝,是因为我没有给192.168.37.32机器的root用户设置密码

root@node02:/etc/ssh# passwd
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

再次执行scp拷贝命令

linux下 scp 和 ssh 命令_第1张图片

一般工作中,我们都是拷贝到远程机器的普通用户的家目录下,root用户是被禁止远程登录的

linux下 scp 和 ssh 命令_第2张图片

应用实例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 
#我所理解的这里的 remote_file 远程文件是指文件的绝对路径

在这里插入图片描述

2、从远程复制到本地

从远程复制到本地,只要将从本地复制到远程的命令的后2个参数调换顺序即可:

linux下 scp 和 ssh 命令_第3张图片

linux下 scp 和 ssh 命令_第4张图片

发散点:上面都是有一个需要我们输入命令的过程,如果我们这个拷贝过程是写在shell脚本中自动执行完成的,不需要和我进行一个交互。我应该如何做呢?接着往下看哦!

ssh 命令

SSH 为Secure Shell 的缩写,SSH为创建在应用层和传输层基础上的安全协议。

SSH(远程连接工具[客户端命令])连接原理:ssh服务是一个守护进程(daemon),系统后台监听客户端 /usr/bin/ssh 的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(默认监听在22端口),包括公共密钥等交换信息。

ssh服务端由2部分组陈: openssh(提供ssh服务) openssl(提供加密的程序)

ssh的客户端图形化工具有: xshell、securecrt、Mobaxterm等

# ssh客户端
root@node01:~# whereis ssh 
ssh: /usr/bin/ssh /etc/ssh /usr/share/man/man1/ssh.1.gz

# sshd守护进程服务端
root@node01:~# ps -ef |grep sshd
root       1384      1  0 15:10 ?        00:00:00 /usr/sbin/sshd -D
root@node01:~# whereis sshd
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、远程登录及执行命令

linux下 scp 和 ssh 命令_第5张图片

linux下 scp 和 ssh 命令_第6张图片

直接执行命令

linux下 scp 和 ssh 命令_第7张图片

远程sudo命令

root@node01:~# ssh [email protected] systemctl status sshd
[email protected]'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 [email protected] hostname
[email protected]'s password: 
node02
root@node01:~# ssh [email protected] sudo systemctl status sshd
[email protected]'s password: 
sudo: no tty present and no askpass program specified

root@node01:~# ssh -t [email protected] sudo systemctl status sshd
[email protected]'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、直接远程连接某台主机

linux下 scp 和 ssh 命令_第8张图片

2、本地执行远程机器的命令

root@node01:~# sshpass -pnihaoma ssh [email protected] hostname
node02

在这里插入图片描述

3、远程连接指定ssh的端口

sshpass -p passwd ssh -p 10000 [email protected] # (当远程主机不是默认22端口,而是10000需要指定该端口)

4、从远程主机拉取文件到本地

linux下 scp 和 ssh 命令_第9张图片

你可能感兴趣的:(linux,ssh,linux)