所以我刚刚将我的Mac mini(2012年末)升级到macOS 10.12(Sierra),一切似乎都很好,但我遇到了一个奇怪的问题,用Capistrano部署代码。我收到以下错误:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<User>().ToTable("Users"); // Your custom IdentityUser class
builder.Entity<IdentityUserLogin<string>>().ToTable("UserLogins");
builder.Entity<IdentityUserToken<string>>().ToTable("UserTokens");
builder.Entity<IdentityUserClaim<string>>().ToTable("UserClaims");
builder.Entity<IdentityUserRole<string>>().ToTable("UserRoles");
builder.Entity<IdentityRoleClaim<string>>().ToTable("RoleClaims");
builder.Entity<IdentityRole>().ToTable("Roles");
}
之前在Mac OS X 10.11(El Capitan)或之前的任何版本中从未出现此问题。为什么现在突然发生这种情况?下面失败的Capistrano部署的完整输出:
Permission denied (publickey).
请确保您拥有正确的访问权限 存储库存在。
答案 0 :(得分:30)
似乎这是一个问题,SSH密钥没有像以前那样在Mac OS X 10.11(El Capitan)中自动添加。这是来自macOS Sierra的预期行为还是与OpenSSH相关的东西?
所以我找到的一个解决方案是使用-A
选项运行ssh-add
- 使用存储在钥匙串中的任何密码将所有已知身份添加到SSH代理中,如下所示:
ssh-add -A
现在这样可行,但不会在重新启动后持续存在。因此,如果您不想再次担心这一点,只需打开用户的~/.bash_profile
文件,如下所示:
nano ~/.bash_profile
并将此行添加到底部:
ssh-add -A 2>/dev/null;
现在当你打开一个新的终端窗口时,一切都应该是好的!
因此虽然ssh-add -A
选项适用于大多数基本情况,但我最近遇到了一个问题,我在一台机器上安装了6-7个Vagrant盒子(使用SSH密钥/身份进行访问)更常见的是id_rsa.pub
。
长话短说,由于服务器访问基于密码而SSH密钥/身份是SSH密钥/身份,因此基于SSH密钥/身份的尝试失败太多,我最终被锁定在远程服务器之外。所以SSH代理尝试了所有我的SSH密钥,失败了,我甚至无法进入密码提示。
问题在于,ssh-add -A
只会随意添加您拥有的每个SSH密钥/身份,即使没有必要这样做;例如在Vagrant盒子的情况下。
经过大量测试后,我的解决方案如下:
首先,如果您的代理程序中添加的SSH密钥/身份比您需要的多 - 如ssh-add -l
所示,则将其全部从代理中清除,如下所示:
ssh-add -D
完成后,启动SSH代理作为后台进程,如下所示:
eval "$(ssh-agent -s)"
现在,它变得奇怪,我不太清楚为什么。在某些情况下,您可以专门向代理添加~/.ssh/id_rsa.pub
密钥/标识,如下所示:
ssh-add ~/.ssh/id_rsa.pub
输入您的密码,点击返回,您应该好好去。
但在其他情况下,只需运行此功能即可添加密钥/标识:
ssh-add -K
如果这一切都有效,请输入ssh-add -l
,您应该会看到一个单独的SSH密钥/标识。
一切都好吗?现在打开您的.bash_profile
:
nano ~/.bash_profile
并将此行添加到底部;如果您有-A
版本,请发表评论或删除:
ssh-add -K
这将允许在每次启动/重新启动时将SSH密钥/身份重新加载到SSH代理。
更新1:基于davidalger’s answer我发现了一个更好的全局解决方案,可以适用于系统上的所有用户。只需通过sudo
打开位于此处的全局SSH配置:
sudo nano /etc/ssh/ssh_config
并将此行添加到文件的底部:
AddKeysToAgent yes
在删除.bash_profile
修复程序之后,这一切都很好。
UseKeychain
选项,并将ssh-add -A
视为解决方案。从macOS Sierra 10.12.2开始,Apple(我假设)为SSH配置添加了UseKeychain
配置选项。检查手册页(通过man ssh_config
)显示以下信息:
UseKeychain
On macOS, specifies whether the system should search for
passphrases in the user's keychain when attempting to use a par-
ticular key. When the passphrase is provided by the user, this
option also specifies whether the passphrase should be stored
into the keychain once it has been verified to be correct. The
argument must be ``yes'' or ``no''. The default is ``no''.
归结为Apple认为解决方案是将ssh-add -A
添加到.bash_profile
as explained in this Open Radar ticket或添加UseKeychain
作为每个用户{{1}中的一个选项}}
答案 1 :(得分:8)
这是来自macOS Sierra的预期行为还是与OpenSSH相关的东西?
这是由于OpenSSH 7.2中的一项新功能导致SSH客户端的行为发生了变化。来自release notes:
ssh(1): Add an AddKeysToAgent client option which can be set to
'yes', 'no', 'ask', or 'confirm', and defaults to 'no'. When
enabled, a private key that is used during authentication will be
added to ssh-agent if it is running (with confirmation enabled if
set to 'confirm').
还引入了其他有趣的(与安全相关的)功能,尽管该版本主要被视为错误修复版本。此特定功能导致OS X上的默认行为更改,因为它的默认值为“no”,OS X(我不知道其他客户端)以前在使用代理时添加了密钥。
因此,如果您将以下内容添加到~/.ssh/config
文件(或应位于ssh_config
中的全局/etc/ssh/ssh_config
)中,则会在使用时将密钥再次添加到您的代理中
AddKeysToAgent yes
这种单线程非常简单:
echo "AddKeysToAgent yes" >> ~/.ssh/config
完成此操作后,我能够实现预期的行为:
$ ssh-add -l
The agent has no identities.
$ ssh -T git@bitbucket.org
logged in as davidalger.
You can use git or hg to connect to Bitbucket. Shell access is disabled.
$ ssh-add -l
2048 SHA256:<snip> (RSA)
答案 2 :(得分:0)
这可以帮助我解决MacOS Serra上的问题:
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa_file