在Docker下面安装一个Ubuntu,并安装ssh来模拟我们的开发环境
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客户端:
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服务在运行中:
service ssh status
service ssh status
免密码登录SSH
直接在命令行中输入密码是不安全的,也不被SSH支持的。可以通过SSH密钥对认证来实现无密码登录。
以下是设置步骤:
在本地机器上生成一个SSH密钥对。如果你已经有一个,你可以使用那个,否则你可以创建一个新的。你可以使用以下命令来生成一个新的SSH密钥对:
bashssh-keygen -t rsa
ssh-keygen -t rsa
当提示你输入文件保存的位置时,只需按回车键,接受默认文件位置。当提示你输入passphrase时,为了无密码登录,这里直接按回车键。
现在,你需要将你的公钥添加到远程服务器的authorized_keys文件中。你可以使用ssh-copy-id命令来完成这个任务:
bashssh-copy-id alien@121.12.22.1
ssh-copy-id alien@121.12.22.1
这个命令将会提示你输入远程服务器的密码,但这是最后一次需要输入密码。
现在,你应该能够无密码登录到远程服务器了。你可以通过运行以下命令来测试:
bashssh alien@121.12.22.1
ssh alien@121.12.22.1
如果你的远程服务器不支持ssh-copy-id命令,你可以手动复制公钥到远程服务器。你可以通过运行以下命令来显示你的公钥:
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa.pub
然后,手动复制输出的内容,将其粘贴到远程服务器的~/.ssh/authorized_keys文件中。如果文件或目录不存在,你需要创建它们。
自动登录
关于伪终端的解释:伪终端是一种虚拟的终端设备,它提供了一个与终端类似的接口,使得非交互式的程序也能够与终端进行交互。在某些情况下,需要分配伪终端,以便在远程登录或执行命令时,能够进行交互式的操作,比如输入密码、执行交互式命令等。
ssh需要一个伪终端来提供一个可以与用户交互的环境。当你在命令行中运行ssh时,它会自动分配一个伪终端。但是,当你在脚本中运行ssh并重定向输入时,ssh无法自动分配一个伪终端,因此你需要使用-t选项来手动分配。
经过验证,针对含有交互式的终端,还是手动输入比较合适。
ssh -t alien@172.17.0.2 <<EOF
root123
echo "登录成功"
EOF
ssh -t alien@172.17.0.2 <<EOF
root123
echo "登录成功"
EOF
因为<<EOF
没有传递到登录成功后,而是先给到了伪终端。好的解决方式是使用密钥登录。