IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux下 scp 和 ssh 命令 -> 正文阅读

[系统运维]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、从远程主机拉取文件到本地

在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-22 13:52:26  更:2021-08-22 13:53:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:00:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码