我编写了一个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这里的意思。
答案 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不会单独处理^J
≡LF
作为回车符号)。这就是为什么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.*
(尽管不一定是这样)。