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 root@192.168.37.32:/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.
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# 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 root@192.168.37.32:/root
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# passwd
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 
#我所理解的这里的 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等

# 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

传统的网络服务程序,如FTPPOPTelnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。

而SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。

SSH之另一项优点为其传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。

1、远程登录及执行命令

在这里插入图片描述

在这里插入图片描述

直接执行命令

在这里插入图片描述

远程sudo命令

root@node01:~# ssh cntsp@192.168.37.32 systemctl status sshd
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:~# ssh cntsp@192.168.37.32 sudo systemctl status sshd
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:~# sshpass -pnihaoma ssh root@192.168.37.32 hostname
node02

在这里插入图片描述

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

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

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

在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Shell脚本是一组以文本文件形式存储的命令,可让用户批量自动运行多个命令而不需要手动输入。SCPSSH命令Linux下常用的文件传输和远程连接命令,通过Shell脚本可以方便的执行它们。 SCP命令可以用于文件传输,它的格式如下: scp [参数] [源文件] [目标文件] 其中,参数通常包括指定端口、指定协议等。源文件可以通过本地路径或远程路径指定,目标文件也可以是本地路径或远程路径。为了脚本能够正常执行,需要预先设置好远程主机的IP地址、用户名和密码。 SSH命令则用于远程连接,常用于远程登录、执行远程命令等操作。可以用以下格式执行SSH命令ssh [参数] [用户名@]远程主机 参数通常包括指定端口、指定密钥文件、禁用远程终端等。远程主机可以通过IP地址或域名进行指定。需要注意,如果通过密码进行连接,需要在Shell脚本中设置好密码。 通过Shell脚本执行SCPSSH命令的流程通常是先判断操作系统类型,然后运行SCPSSH命令。常见的Shell脚本语言包括Bash、Zsh、Ksh等,使用不同语言写出的脚本可能存在差异。在执行SCPSSH命令的过程中,需要注意验证端口、用户名、密码等信息,确保连接和传输的安全性。 最后,需要提醒的是,在使用SCPSSH命令传输和连接时,需要遵循Linux安全最佳实践,如禁用root用户登录、使用非默认端口等。同时,在编写Shell脚本时,需要注意脚本语言的规范,以及安全性的验证和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

觅食的蛇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值