Skip to content

商务合作:vTikTok


公众号:



在Docker下面安装一个Ubuntu,并安装ssh来模拟我们的开发环境

sh
docker pull ubuntu
docker run -it --name ubuntu ubuntu /bin/bash

apt update
apt install -y openssh-server
service ssh start

apt install -y vim

# sudo apt-get update
sudo apt-get install net-tools  # 使用ifconfig,最新版本的Ubuntu中,ifconfig命令已被弃用。
ifconfig

# sudo apt-get install iproute2   # 使用ip命令,取而代之的是ip命令。您可以使用以下命令来查看网络接口的配置信息:
# ip addr show # 这将显示所有网络接口的详细信息,包括IP地址、子网掩码、广播地址等。如果您只想查看活动的网络接口,可以使用以下命令:
# ip link show # 这将显示所有活动的网络接口及其状态。

passwd # 设置root密码,这个密码也可以用来登录ssh

# 添加一个新的用户(专门用于SSH登录,不知道为何root用户远程登录不上)
adduser alien # 创建的用户是可以多终端登录一个用户的
passwd alien
# 现在,新用户已经创建成功。接下来,您可以使用以下命令将新用户添加到sudo组(以便拥有管理员权限)
usermod -aG sudo alien # 将新用户添加到sudo组(以便拥有管理员权限)-a 代表添加,-G 代表组

# su alien # 切换到alien用户
# su # 切换到root用户
docker pull ubuntu
docker run -it --name ubuntu ubuntu /bin/bash

apt update
apt install -y openssh-server
service ssh start

apt install -y vim

# sudo apt-get update
sudo apt-get install net-tools  # 使用ifconfig,最新版本的Ubuntu中,ifconfig命令已被弃用。
ifconfig

# sudo apt-get install iproute2   # 使用ip命令,取而代之的是ip命令。您可以使用以下命令来查看网络接口的配置信息:
# ip addr show # 这将显示所有网络接口的详细信息,包括IP地址、子网掩码、广播地址等。如果您只想查看活动的网络接口,可以使用以下命令:
# ip link show # 这将显示所有活动的网络接口及其状态。

passwd # 设置root密码,这个密码也可以用来登录ssh

# 添加一个新的用户(专门用于SSH登录,不知道为何root用户远程登录不上)
adduser alien # 创建的用户是可以多终端登录一个用户的
passwd alien
# 现在,新用户已经创建成功。接下来,您可以使用以下命令将新用户添加到sudo组(以便拥有管理员权限)
usermod -aG sudo alien # 将新用户添加到sudo组(以便拥有管理员权限)-a 代表添加,-G 代表组

# su alien # 切换到alien用户
# su # 切换到root用户

客户端登录ssh(但是要注意:客户端也要在Docker中进行,因为Docker的网络属于Docker局域网,外部无法访问,ping不通)

安装ssh客户端:

sh
sudo apt-get install openssh-client
ssh root@172.17.0.2
sudo apt-get install openssh-client
ssh root@172.17.0.2

注意事项:如果出现,ssh: connect to host 172.17.255.255 port 22: Network is unreachable,那么很可能是说明服务器没有安装openssh-server或者是openssh-server没有启动。可以在服务器上面通过apt list openssh-server查看服务器是否安装了ssh服务器。

确保容器的SSH服务在运行中:

sh
service ssh status
service ssh status

免密码登录SSH

直接在命令行中输入密码是不安全的,也不被SSH支持的。可以通过SSH密钥对认证来实现无密码登录。

以下是设置步骤:

  1. 在本地机器上生成一个SSH密钥对。如果你已经有一个,你可以使用那个,否则你可以创建一个新的。你可以使用以下命令来生成一个新的SSH密钥对:

    bash
    ssh-keygen -t rsa
    ssh-keygen -t rsa

    当提示你输入文件保存的位置时,只需按回车键,接受默认文件位置。当提示你输入passphrase时,为了无密码登录,这里直接按回车键。

  2. 现在,你需要将你的公钥添加到远程服务器的authorized_keys文件中。你可以使用ssh-copy-id命令来完成这个任务:

    bash
    ssh-copy-id alien@121.12.22.1
    ssh-copy-id alien@121.12.22.1

    这个命令将会提示你输入远程服务器的密码,但这是最后一次需要输入密码。

  3. 现在,你应该能够无密码登录到远程服务器了。你可以通过运行以下命令来测试:

    bash
    ssh alien@121.12.22.1
    ssh alien@121.12.22.1

如果你的远程服务器不支持ssh-copy-id命令,你可以手动复制公钥到远程服务器。你可以通过运行以下命令来显示你的公钥:

bash
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa.pub

然后,手动复制输出的内容,将其粘贴到远程服务器的~/.ssh/authorized_keys文件中。如果文件或目录不存在,你需要创建它们。

自动登录

关于伪终端的解释:伪终端是一种虚拟的终端设备,它提供了一个与终端类似的接口,使得非交互式的程序也能够与终端进行交互。在某些情况下,需要分配伪终端,以便在远程登录或执行命令时,能够进行交互式的操作,比如输入密码、执行交互式命令等。

ssh需要一个伪终端来提供一个可以与用户交互的环境。当你在命令行中运行ssh时,它会自动分配一个伪终端。但是,当你在脚本中运行ssh并重定向输入时,ssh无法自动分配一个伪终端,因此你需要使用-t选项来手动分配。

经过验证,针对含有交互式的终端,还是手动输入比较合适。

sh
ssh -t alien@172.17.0.2 <<EOF
root123
echo "登录成功"
EOF
ssh -t alien@172.17.0.2 <<EOF
root123
echo "登录成功"
EOF

因为<<EOF没有传递到登录成功后,而是先给到了伪终端。好的解决方式是使用密钥登录。