# ssh-keygen

ssh-keygen -C "936108248@qq.com"
ssh-keygen -f ~/.ssh/vm1_id_rsa
ssh-keygen -f ~/.ssh/jenkins_id_rsa -t rsa -m PEM # jenkins使用
1
2
3
# ssh-keygen 参数
-b:指定密钥长度;
-e:读取openssh的私钥或者公钥文件;
-C:添加注释;
-f:指定用来保存密钥的文件名;
-i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥;
-l:显示公钥文件的指纹数据;
-N:提供一个新密语;
-P:提供(旧)密语;
-q:静默模式;
-t:指定要创建的密钥类型
1
2
3
4
5
6
7
8
9
10
11

默认生成文件名

id_rsa

id_rsa.pub

终端输入

Linux命令可用 gitbash运行

eval # 作用未知 
ssh-agent -s 
1
2

输出

SSH_AUTH_SOCK=/tmp/ssh-LBPDpZ2cms5Y/agent.999; export SSH_AUTH_SOCK; SSH_AGENT_PID=1000; export SSH_AGENT_PID; echo Agent pid 1000;

代表 ssh 正常运行。

ssh-add ~/.ssh/id_rsa # 把专用密钥添加到[ssh-agent](http://lnmp.ailinux.net/ssh-agent)的高速缓存中
1

# gitee配置

# gitbash运行
ssh-keygen -C '936108248@qq.com' -f ~/.ssh/gitee_id_rsa
# 将公钥放到Gitee上
ssh -T git@gitee.com
1
2
3
4

# 公钥cient 2 server

# 手动复制公钥文件信息到server: ~/.ssh/authorized_keys

# 需要注意文件编码 UTF8, windows可能为ANSI
1
2
3

上传公钥后,目标服务器对应用户下的~/.ssh/authorized_keys文件会添加一行内容

远程主机上的authorized_keys文件中可以保存多个公钥,多个公钥直接追加在末尾。

# win快速登录config

路径: ~/.ssh/config

# 设置不同密钥,访问不同服务器

Host xxx.xxxx.xxx.xxx         # 服务器代号,可自定义用来快速登录
HostName  XXX.XXX.XXX.XXX # 可以是域名也可以是IP
User  username                  # username 是要使用的登录名,如root
IdentityFile ~/.ssh/VM.id.rsa       # 放私钥的路径 
# 用户名的路径上一定不能有中文,如果有就无法实现免密登录
1
2
3
4
5
6
7
# 示例   $ ssh vm1 可快速登录
Host vm1
HostName 192.168.211.128
User root
IdentityFile ~/.ssh/vm1_id_rsa

Host 192.168.211.128
User root
IdentityFile ~/.ssh/jenkins_id_rsa

Host gitee.com
HostName gitee.com
User git
IdentityFile ~/.ssh/gitee_id_rsa
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# ssh

ssh root@192.168.1.101 # 然后输入密码登录
1

# 远程执行命令

一、执行简单的命令: ssh root@127.0.0.1 "df -h" 一次执行多条命令,使用分号把不同的命令隔起来就 OK 了 ssh root@127.0.0.1 "df -h;pwd" 添加 -t 参数后,ssh 会保持登录状态,直到你退出需要交互的命令。 ssh -t root@127.0.0.1 "df -h" 三、执行本地的脚本 我们在本地创建一个脚本文件 test.sh: 然后运行下面的命令: ssh root@127.0.0.1 < test.sh 通过重定向 stdin,本地的脚本 test.sh 在远程服务器上被执行。 接下来我们期望能为脚本 test.sh 传递一个参数: 然后尝试执行下面的命令: ssh root@127.0.0.1 < test.sh helloworld ssh root@127.0.0.1 < "test.sh helloworld" 显示了执行的结果:方法都无法为脚本传递参数。 要想在这种情况下(远程执行本地的脚本)执行带有参数的脚本,需要为 bash 指定 -s 参数: ssh root@127.0.0.1 'bash -s' < test.sh helloworld

# scp

# 复制文件到文件夹 f
scp aa.jar root@43.224.34.73:/www/src
scp -P 3333 root@127.0.0.1:/www/src/ubuntu-20.04.5-desktop-amd64.iso G:\ISO
# 复制文件夹下文件到文件夹 dir
scp -r /root/sourcedir root@43.224.34.73:/www/tatgetdir
1
2
3
4
5

# 命令功能

scp -r /root/lk root@43.224.34.73:/home/lk/cpfile

-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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# rsync

rsync -av /data/test 10.10.10.155:/dat
1

# ssh-server

  • windows ssh-server开启

设置 -> 应用和功能 -> 可选功能 -> OpenSSH Server

# 服务手动开启
net start sshd
net stop sshd
1
2
3
  • 日志

    # C:\ProgramData\ssh\sshd_config
    
    SyslogFacility LOCAL0
    
    1
    2
    3
  • 启用公钥认证

    #C:\ProgramData\ssh\sshd_config
    
    PubkeyAuthentication yes
    
    # 会去 C:\\ProgramData\\ssh\\administrators_authorized_keys查找公钥
    # Match Group administrators
    #       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
    
    1
    2
    3
    4
    5
    6
    7