使用ssh过程中遇到的一系列问题

发布时间 2024-01-11 03:18:25作者: Just_Now

VScode 报错Bad owner or permissions

解决方法一:更改config文件权限

img
试了一下cmd运行ssh,一样报错。
img
解决方法是修改配置文件属性
img
第二步点击会弹出如下框,选第一个即可。然后就可以进入第三步完成后面的。
img
完成所有步骤然我这边就解决了,可以正常连接。

解决方法二:更改默认ssh为git下的ssh

vscode连接虚拟机遇到问题,报错Bad owner or permissions。但是我用git里的bash连接虚拟机没问题,cmd看了一下我有两个ssh。在上面的ssh会默认优先。可以通过修改系统环境变量来更改次序。

修改系统环境变量

下面是更改系统环境变量过程。
img
img
选中系统变量里的Path,点下面编辑,把Git里的文件夹顺序换到OpenSSH文件夹上面。
img
然后确定保存即可,上面那个图的两个窗口也要点确定哈。

刷新系统环境变量

然后win+r输入cmd,打开cmd就能使环境变量立即生效,不用重启电脑。如果你已经打开了一个cmd,需要关闭这个,再按上述步骤重新打开一个cmd才会生效。
img
然后再在vscode里连接就正常了。

SSH简介

SSH是一个协议,我简单介绍下,就是连接两个支持SSH协议的设备。一个服务端一个客户端,比如我想连我的虚拟机,那我这台机子就要安装SSH客户端,虚拟机里要有SSH服务端(SSHD),然后我这边用ssh客户端给虚拟机那边发密码(Password)或者密匙(Publickey)就可以连接上了。当然不是我说的这么简单,不然要人家协议干嘛,个中细节请点链接查看。
现在的系统都自带ssh客户端,所以只需要在虚拟机安装服务端。

Termux软件简介

我的情况比较特殊,我想利用上我的安卓平板,我本来想着在安卓系统里下一个虚拟终端,到时候租个云服务器不就可以平板编程了吗。我还给平板买了键盘,多舒服。然后搜了一下下了一个Termux,这软件老牛了,只用SSH连接服务器那只是杀鸡用牛刀。这软件不用root就能在手机里模拟一个Linux系统,真的6。然后我便突发奇想,还不如我先用我的Windows连平板呢。然后先在termux里下载ssh服务端,下载之前要先换源,玩过Linux的都知道,不然下载很慢的。

Termux安装后初始配置及安装OpenSSH

首先在安卓设备上安装,这是Github上的安装包,我下的是第一个v8a.apk。
安装ssh,用pkg安装

#授权termux访问安卓系统文件权限
termux-setup-storage
# 换源
sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@' $PREFIX/etc/apt/sources.list
#安装SSH
pkg install openssh
# 启动SSH服务端
sshd
#设置用户密码,用于待会客户端登录
passwd

Windows端用SSH客户端连接Termux里的SSHD服务端

至于连接,又有许多问题,就是关于ssh的使用问题,以前不是很透彻,只会用Xshell,Xshell更新不方便,卸载也没卸载掉,就改用vscode了,用了Remote-SSH插件。后面一想这些不都是个壳子吗,既然Windows自带ssh客户端,那我用命令行都可以连接,于是乎在cmd里一样能连上。win+r输入cmd打开cmd都会吧。查看本设备IP也应该都会吧,cmd里用ipconfig命令,termux里用ifconfig命令。cmd输入命令后如下,其中无线局域网适配器WLAN里面的IPV4地址就是。termux里和其他Linux系统输入ifconfig同理可看。
img

ssh username@ip -p port    #username和ip换成你自己的用户名和要连接设备的ip
# termux默认ssh端口是8022 ,且termux不用带用户名,一般是要带的
# 然后输入刚才在termux设置的密码即可

img

Termux端用SSH客户端连接Windows端SSHD服务端

然后我自然就开始折腾了,能不能反向连,就是我用termux连一下Windows,反正以后也是要连云服务器的,不如先在局域网里试试手,其实可以把虚拟机桥接的(我虚拟机是CentOS7,和termux设置大同小异即可连上),不过自己就是犟,非要用Windows部署SSH服务端。

Windows安装OpenSSH服务端

Windows自己有SSH客户端,如第一个图所示,我都有俩,当时安装Git也带了一个来。但是服务端需要自己安装,Windows可以在可选功能里安装OpenSSH服务端,点管理可选功能。
img
img
因为我已经安装过了,没有安装的就点击上面的添加功能,搜索一下选中安装即可。

开启SSHD服务

然后就是开启服务端服务了,这里打开powershell,win+r键打开运行,输入powershell即可,也可以鼠标右键屏幕左下角徽标键,平常关机是左键点那里,现在右键就可以打开一个列表,里面也有powershell,还有管理员模式,一会可能会用到,先记下。打开powershell后输入

Get-Service | where Name -Like '*ssh*'

这条命令是为了确认你是否安装了客户端,如果安装了就会有输出。
img

然后输入命令启动sshd服务

Start-Service sshd

img
报错了,因为权限不够,所以要以管理员身份运行powershell,一种方法就是右键左下角徽标键。另一种是直接在当前以普通权限运行的powershell里输入

Start-Process powershell -verb runas

就会打开一个新的powershell窗口,此时已经是管理员权限了,然后再次输入启动sshd的命令发现可以运行。
img

Termux运行ssh连接Windows服务端

至此,Windows的SSH服务端已经配置完成,然后只需要一个有SSH客户端的设备连接即可。
然后本来就像刚才Windows连接termux一样,我应该在termux里输入以下命令连接。

ssh username@ip -P port    #username和ip换成你自己的用户名和要连接设备的ip

结果是
img

Windows服务端用户名密码

我始终不知道我用户名和密码是啥,大坑,我试了快一个小时,后来搜了一下发现用户名不是你锁屏时的那个名字而是你的文件夹里的用户名,就是下面第一个文件夹的文件名28485.
img
然后密码不是登录的PIN码,是你登微软账号的密码,不知道的可以点下图中的更改。
img

然后就能轻松登录了,懒得截图了。

连接过程中网络端口问题

当然两台设备要在一个局域网下,这应该不用多说吧,互相能ping通,且端口要打开,防火墙允许通过。这些按我的步骤来是不用设置的,端口的话SSH默认是22端口,你开启SSH服务自动就开了,一般不会有问题。倒是Termux,我没有root平板,始终只是一个架空的Linux,1~1024端口是没权限的,所以termux自己很识趣的默认选择了8022端口,所以连接termux命令要加一个-p 8022,而连接Windows可以省略-p参数。
这些在文档里都有说明,甚至配置文件里可以改端口,当然如果我把termux服务端的sshd_config配置文件里的8022端口改成22端口也没用,因为没用权限开启不了22端口,于是乎就会无法访问。
这个网站可以搜索文档及命令,相当于电子版man命令.

Windows端SSH客户端连接虚拟机里的CentOS7系统

然后瞎忙活了一天,无非是两台设备,一台Windows,一台安卓仿Linux(算半个Linux)。两台设备都安装SSH客户端以及SSH服务端,然后你连我我连你。只要注意放在一个局域网下还是很好实现的。然后我觉得要开始干正事了,开始用我的Windows连接虚拟机Virtulbox里的CentOS7。CentOS好像要停止维护了,不过与我这等小卡拉米无关。
CentOS比起安卓上的termux可是纯正的Linux,自然和连termux类似,过程大同小异,CentOS还是很多人用的,网上教程一大把。我很早就装了,当初为了玩Linux,那时候拿XShell软件无脑连就行了,这次我势必要搞懂SSH,自己实现免密登录。

利用密钥实现免密连接

之前说了,SSH允许密码(Password)或者密匙(Publickey)登录,刚才那些都是密码登录,但是每次登录都要输入密码,为了偷懒就需要密匙了。我简单介绍一下原理吧,密匙涉及到加密,密匙是成对的,SSH使用非对称加密,就是一个公钥一个私钥,私钥就是密码,公钥是要放到服务器上的。因为这是一对,我想告诉你啥我要用私钥加密一下发给你,然后你拿我给你的公钥解密就知道我要告诉你啥了。
我现在想用Windows免密登录CentOS7,所以我需要先在本地生成一对密匙,然后把私钥放自己这里,把公钥给到CentOS7,然后登录就不用密码了。

- 首先生成一对密钥

ssh-keygen
默认使用rsa加密算法,可用-t指定其他加密算法

img
输入命令后第一行询问你文件名,如果回车就是红色框起来的括号里的名字,第二行问你口令,如果你想偷懒免密登录就直接回车,否则输入口令,然后第三行确认口令,还是回车就可以。然后就生成好了,去到红框文件夹里会发现两个文件id_rsa和id_rsa.pub。id_rsa是私钥,id_rsa.pub就是公钥。

把公钥传到服务器上

方法一:使用scp命令

scp也是基于ssh协议的,只不过可以传送文件。命令如下
img

可以看到输入命令后弹出输入密码,输入密码后文件就传送完成了。我都用的绝对路径

scp 文件所在位置路径 username@ip:传送目的绝对路径

img
进入CentOS7终端,输入

cat id_rsa.pub >> ./.ssh/authorized_keys

将公钥写入authorized_keys
此时再次登录就不用输入密码了
img

方法二:使用ssh-copy-id命令

ssh-keygen
ssh-copy-id root@192.168.0.66     #username和ip换成你自己的

我在powershell里用ssh-copy-id报错,然后到git里的bash里用就可以
img
可以看到再次连接已经不用输入密码了。

如果非要在PowerShell里使用那就复制以下代码

function ssh-copy-id([string]$userAtMachine, $args){   
    $publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
    if (!(Test-Path "$publicKey")){
        Write-Error "ERROR: failed to open ID file '$publicKey': No such file"            
    }
    else {
        & cat "$publicKey" | ssh $args $userAtMachine "umask 077; 
		test -d .ssh || mkdir .ssh ;
		cat > .ssh/tmp ;
		grep -I -r -l $'\xEF\xBB\xBF' .ssh/tmp | xargs sed -i 's/\xEF\xBB\xBF//g' ;
		tr -d '\r' < .ssh/tmp >>.ssh/authorized_keys ;
		rm -f .ssh/tmp|| exit 1"      
    }
}
ssh-copy-id username@ip     #username和ip换成你自己的

稍作解释,上述脚本默认你的公钥文件是C:\Users\28485.ssh\id_rsa.pub,如果不是自己改,只要是你用ssh-keygen没加参数生成且第一步是回车那就是默认,之前也提到过,在上面有一张截图我用红框标记了。
然后从Windows读取到Linux的文本有问题,两个系统的文本文件格式有些差异,主要表现在换行符的差异和BOM。tr那一行用来删除Windows换行符多出来的部分,grep那一行用于删除BOM。
(BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32))

下面是我的过程
img
可以看到再次连接已经不用输入密码了。

VScode配置文件实现免密登录

然后从VScode里自然也能免密登录,只用让VScode连接时带上私钥即可,配置文件如下
img