使用SSH克隆存储库时出现“权限被拒绝”错误?

时间:2013-12-19 21:32:48

标签: ruby git shell ssh

我编写了一个shell脚本,用于在我登录到每个系统的100多个系统上从Git克隆存储库。

我通过在托管它的系统上运行脚本来测试脚本,但是当我通过使用SSH从其他系统登录来运行相同的脚本时,它会给我一个“权限被拒绝”错误,尽管脚本存在于我需要制作克隆的同一系统。

我使用的是Ruby 1.8.7。

对于登录目的,我创建了另一个脚本文件,首先我登录并在这里运行脚本是我的代码login.sh这里$1是我通过端口login.sh的参数

sshpass -p 1234 ssh -p $1 admin@localhost './my_update_steps.sh &' 

在脚本中也进行更改,以便它可以使用keygen自动处理密钥生成。这是代码:

ssh-keygen -R myhostname
ssh-keyscan -H myhostname >> ~/.ssh/known_hosts
rm ~/.ssh/known_hosts.old

编辑1

通过使用此link,我已将.ssh/config文件中的更改更改为

Host *
    StrictHostKeyChecking no 

但仍然是错误

Warning: Permanently added 'XXXX.XXXXX.XXXX.XXX'  to the list of known hosts.^M
Permission denied (publickey).^M
fatal: The remote end hung up unexpectedly

如何解决此错误?有什么东西我错过了吗? 什么是^ M这里的意思。

3 个答案:

答案 0 :(得分:2)

如果您在同一主机上克隆存储库,则实际上不需要使用ssh协议。只需指定直接路径,就可以更有效地克隆:

git clone /home/admin/path/repository.git

当然,进行克隆的用户需要对存储库中的文件具有读取权限。如果有许多人推送到源存储库,这可能是一个需要维护的问题;如果是这种情况,请参阅these answers以获取有关正确设置权限的一些指导。

至于你的ssh问题:根据你的脚本显示内容,你错过了最后一步,即将公钥的副本安装到~/.ssh/authorized_keys。即使您以同一用户身份登录localhost,这也是必需的。您可以使用ssh-copy-id执行此操作,sshpass -p 1234 ssh-copy-id localhost

{{1}}

答案 1 :(得分:2)

嗯,您提供的信息不足以治愈,但它足以设置诊断。

出现^M Ctrl-M )字符的原因是windows / unix对如何结束文本文件中的行的争议。 Windows(和DOS)以CR^M,回车,ASCII码13)后跟LF(换行,ASCII码10)终止文本行。 Linux仅使用LF,因此回车符显示为文本的一部分。这件事可能会破坏几乎所有事情。 (事实上​​,MacOS仅使用CR终止文本行,使地狱更加燃烧。)

如果您尝试使用二进制FTP协议将文本文件从win传输到nix框(反之亦然),您将最终得到尾随^M s(win⇒nix案例)或将所有的行连接到一个带有^J的大行(nix⇒win的情况下,win不会单独处理^JLF作为回车符号)。这就是为什么FTP文本/二进制传输之间存在差异的原因。

您的错误显示您遇到了EOL问题。想象一下,您的脚本以及您的ssh密钥文件都有尾随^ M 。从行的开头读取公钥直到它结束;额外的尾随^ M使得密钥不合适(参见字符串比较:abc!= abc^M,对吧?)

因此。总结。我建议你使用标准方法在远程机器上执行脚本:

ssh … <<ENDSSH
command1.sh
command2.sh
…
commandN.sh
ENDSSH

这会将EOL处理委托给操作系统,他们会尽力而为。我很乐意回答一些即将出现的问题,但就目前而言,我可以根据您发布的内容提供所有诊断。

答案 2 :(得分:1)

此错误:

Permission denied (publickey).

告诉我你可能错过了其他系统上的密钥文件。

您需要确保已将SSH密钥推送到要尝试克隆的每个系统。

为简洁起见,您的密钥位于~/.ssh/,通常类似于id_rsa.*(尽管不一定是这样)。