问题描述
我希望能够通过ssh登录到远程,而不必一直输入密码。
-
我如何设置它?
-
执行password-less会话需要不同的命令吗?
最佳解决办法
Answer
执行这个命令:
ssh-keygen
Then you’ll need to copy the new key to your server:
ssh-copy-id user@host
## or if your server uses custom port no:
ssh-copy-id "user@host -p 1234"
密钥复制后,正常情况下ssh进入机器:
ssh user@host
您现在可以登录而无需从您执行命令的特定机器输入密码。
例子
not-marco@rinzwind-desktop:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/not-marco/.ssh/id_rsa):
Created directory '/home/not-marco/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/not-marco/.ssh/id_rsa.
Your public key has been saved in /home/not-marco/.ssh/id_rsa.pub.
The key fingerprint is:
b1:25:04:21:1a:38:73:38:3c:e9:e4:5b:81:e9:ac:0f not-marco@rinzwind-desktop
The key's randomart image is:
+--[ RSA 2048]----+
|.o= . oo. |
|*B.+ . . |
|*=o . o . |
| = . = |
|. o S |
|E. |
| o |
| . |
| |
+-----------------+
not-marco@rinzwind-desktop:~$ ssh-copy-id not-marco@server
not-marco@server's password:
Now try logging into the machine, with "ssh 'not-marco@server'", and check in:
~/.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
Explanation
假设您已经可以通过SSH成功连接到您的服务器。
您将需要生成一个SSH密钥对,该密钥对允许您在不使用密码的情况下将自己识别为自己。如果您愿意,您可以选择使用密码保护密钥,但可以留空,以允许完全password-less SSH访问。
-
首先通过运行
ssh-keygen
创建SSH密钥对,这将创建一个id_rsa
和id_rsa.pub
文件。pub
文件就是服务器上的文件,私钥(id_rsa
)就是你的伴侣,并且是你如何识别自己。 -
接下来使用
ssh-copy-id user@server
将公钥替换为远程用户和服务器的机器DNS名称或IP地址,将公钥复制到您的服务器。它会提示输入您的SSH密码,输入密码,如果全部成功完成,您将可以通过ssh user@server
访问本机而不需要密码。
参考
次佳解决办法
键入以下命令:
-
ssh-keygen
按Enter
键直到出现提示 -
ssh-copy-id -i root@ip_address
(它会一次询问主机系统的密码) -
ssh root@ip_address
现在你应该可以在没有任何密码的情况下登录。
第三种解决办法
我通常使用sshpass
,使用sudo apt-get install sshpass
进行安装并像这样使用它
sshpass -p 'password' ssh your_username@your_server
第四种办法
我通常这样做的方式如下:
ssh-keygen -t rsa
(当提示输入密码时,请将其留空)
然后:cat ~/.ssh/id_rsa.pub | ssh username@hostname 'cat >> .ssh/authorized_keys'
(这要求文件夹.ssh位于目标主机名的主目录中,其中包含authorized_keys文件)
当然,用所需的用户名和主机名替换所需的主机名或IP地址
之后,就像您习惯的那样,只需SSH即可访问该框。
第五种办法
Disable Password Authentication
Because a lot of people with SSH servers use weak passwords, many online attackers will look for an SSH server, then start guessing passwords at random. An attacker can try thousands of passwords in an hour, and guess even the strongest password given enough time. The recommended solution is to use SSH keys instead of passwords. To be as hard to guess as a normal SSH key, a password would have to contain 634 random letters and numbers. If you’ll always be able to log in to your computer with an SSH key, you should disable password authentication altogether.
If you disable password authentication, it will only be possible to connect from computers you have specifically approved. This massively improves your security, but makes it impossible for you to connect to your own computer from a friend’s PC without pre-approving the PC, or from your own laptop when you accidentally delete your key.
It’s recommended to disable password authentication unless you have a specific reason not to.
To disable password authentication, look for the following line in your sshd_config file:
#PasswordAuthentication yes
replace it with a line that looks like this:
PasswordAuthentication no
Once you have saved the file and restarted your SSH server, you shouldn’t even be asked for a password when you log in.
https://help.ubuntu.com/community/SSH/OpenSSH/Configuring#disable-password-authentication
第六种办法
[该解决方案专门针对使用Windows将SSH存入其远程机器的用户,包括AWS Cloud和GCE Cloud上的云图像]
(如果这对你有用,高度赞赏,感谢您的耐心。)
(免责声明)
最近使用此解决方案在GCE上远程登录新部署的vm映像。
使用的工具:
-
puttygen [puttygen下载]
-
winscp [winscp下载]
执行步骤:
-
使用puttygen生成公钥/私钥对。
-
将公钥上传到您的云服务器或远程位置。
说明(如何操作):
1.生成一个密钥/对或使用现有的私钥
(我拥有一个私钥)
打开puttygen
,按加载按钮并选择您的私钥(*.pem
)文件。
(我没有私钥)
-
打开puttygen,
-
在Parameters部分中选择所需的密钥类型SSH2 DSA(您可以使用RSA或DSA)…并且将密码短语字段保留为空是非常重要的,
-
按下生成并按照说明生成(公/私)密钥对。
(来源1,链接如下)
2.创建一个新的’authorized_keys’文件(带记事本)
将公钥数据从PuTTY密钥生成器的“公用密钥粘贴到OpenSSH authorized_keys文件”部分中,并将密钥数据粘贴到”authorized_keys”文件中。
确保此文件中只有一行文本。
3.将密钥上传到Linux服务器
-
打开WinSCP,
-
选择SFTP文件协议并使用您的ssh证书登录。
-
成功时,您会在远程计算机上看到主目录结构。
将authorized_keys文件上传到远程机器的主目录。
4.设置适当的权限
制作.ssh
目录(如果不存在)
将authorized_keys
文件复制到.ssh目录。 (这将取代任何现有的authorized_keys
文件,请注意这一点)。
如果文件存在,只需将此文件的内容添加到现有文件。
运行命令来设置权限:
$ sudo chmod 700 .ssh && chmod 600 .ssh/authorized_keys
现在,您将可以在不输入证书的情况下ssh进入远程机器。
进一步阅读:
第七种办法
如果您创建公钥/私钥密钥对并使用我们新创建的公钥登录,则不需要输入密码。根据您的key-ring和/或ssh代理的配置,您可能需要使用密码来保护密钥。
这是您的许多short howto之一。对这种方法的安全性至关重要的是,生成的私钥仍然是私有的!你不应该与任何人分享或允许任何人访问它。
该命令在~/.ssh/
中生成一个合理的强键:
ssh-keygen -b 4096
在~/.ssh/
中,您可以找到您的公钥为id_rsa.pub
。它的内容应通过传输介质(笔式驱动器)或短时间在服务器上启用密码验证后附加到服务器authorized_keys
文件,然后使用ssh-copy-id ~/.ssh/id_rsa.pub username@server
然后再次禁用它。
如果您选择使用密码保护您的密钥(在第一步中),则可以使用ssh-agent
或Ubuntu密钥环在本地保护该密码,这样您就不必一直键入密码。
第八种办法
远程登录/复制,无需输入密码
用于远程登录和远程复制的应用程序ssh
和scp
分别允许您在不提供密码的情况下与远程主机通信。这要求您按照下面描述的身份验证程序进行操作。客户端指的是您所坐的机器,而服务器是指您想要登录的机器,而无需输入密码。认证程序的步骤是:
-
运行ssh-keygen以生成私钥和公钥,除非已在您的机器上完成。这些文件存储在
$HOME/.ssh
的文件中。 -
将公钥文件的内容附加到服务器上的文件
$HOME/.ssh/authorized_keys
或$HOME/.ssh/authorized_keys2
。
有三种不同类型的认证协议。在运行ssh-keygen时指定类型:
-
SSH协议版本1,RSA1:这是默认选择,并导致文件身份(私钥,应采取
chmod 0700
以确保此文件对其他人不可读)和identity.pub(公钥)。 -
SSH协议版本1 RSA:通过运行
ssh-keygen -t rsa
获得,并生成文件id_rsa
(私钥)和id_rsa.pub
(公钥) -
SSH协议版本1,DSA:通过运行
ssh-keygen -t dsa
获得,并生成文件id_dsa
(私钥)和id_dsa.pub
(公钥)
运行ssh-keygen时,您可以依靠默认答案(意味着您不提供密码)。这使得整个set-up变得简单,但也不安全。
您可以指定ssh选项使用的密钥类型; ssh -1
强制使用RSA1密钥(协议版本1),而ssh -2
强制ssh仅尝试RSA或DSA密钥(协议版本2)。在下面的例子中,我们在远程主机上生成并安装RSA1和DSA密钥,以便您拥有更大的灵活性。您可以使用该行在.ssh
目录中创建一个配置文件
Protocol 1,2
这使得ssh在RSA /DSA(协议版本2)之前尝试RSA1(协议版本1)连接。
使用RSA1密钥
remote=user@remotehost # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi'
# copy RSA1 key:
scp identity.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat identity.pub >> authorized_keys"
使用DSA密钥
remote=user@remotehost # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi'
# copy DSA key:
scp id_dsa.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat id_dsa.pub >> authorized_keys2"
如果您在生成密钥时未使用密码,则只需执行此操作。您可以通过运行ssh $ remote来测试连接,并查看您是否可以在不提供密码的情况下登录(您可能需要使用-1
或-2
作为ssh的选项)。当然,对于任何想要登录的计算机都可以重复该过程。
如果您确实使用密码短语,则必须运行程序ssh-agent
以启动一个特殊的shell,随后ssh-add
将您的密钥/密码短语组合与sshd
一起注册。有关更多信息,请参阅这些程序的手册页。
用于自动化password-free连接的脚本:ssh-no-password.sh
#!/bin/sh
# create ssh connections without giving a password
if [ $# -lt 1 ]; then
echo Usage: $0 username@remotehost
exit
fi
remote="$1" # 1st command-line argument is the user@remotehost address
this=$HOST # name of client host
# first check if we need to run ssh-keygen for generating
# $HOME/.ssh with public and private keys:
if [ ! -d $HOME/.ssh ]; then
echo "just type RETURN for each question:" # no passphrase - unsecure!!
# generate RSA1, RSA and DSA keys:
echo; echo; echo
ssh-keygen
echo; echo; echo
ssh-keygen -t rsa
echo; echo; echo
ssh-keygen -t dsa
else
# we have $HOME/.ssh, but check that we have all types of
# keys (RSA1, RSA, DSA):
if [ ! -f $HOME/.ssh/identity ]; then
# generate RSA1 keys:
echo "just type RETURN for each question:" # no passphrase - unsecure!!
ssh-keygen
fi
if [ ! -f $HOME/.ssh/id_rsa ]; then
# generate RSA keys:
echo "just type RETURN for each question:" # no passphrase - unsecure!!
ssh-keygen -t rsa
fi
if [ ! -f $HOME/.ssh/id_rsa ]; then
# generate DSA keys:
echo "just type RETURN for each question:" # no passphrase - unsecure!!
ssh-keygen -t dsa
fi
fi
cd $HOME/.ssh
if [ ! -f config ]; then
# make ssh try ssh -1 (RSA1 keys) first and then ssh -2 (DSA keys)
echo "Protocol 1,2" > config
fi
# copy public keys (all three types) to the destination host:
echo; echo; echo
# create .ssh on remote host if it's not there:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi'
# copy RSA1 key:
scp identity.pub ${remote}:.ssh/${this}_rsa1.pub
# copy RSA key:
#scp id_rsa.pub ${remote}:.ssh/${this}_rsa.pub
# copy DSA key:
scp id_dsa.pub ${remote}:.ssh/${this}_dsa.pub
# make authorized_keys(2) files on remote host:
echo; echo; echo
# this one copies all three keys:
#ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_rsa.pub >> authorized_keys2; cat ${this}_dsa.pub >> authorized_keys2;"
# this one copies RSA1 and DSA keys:
ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_dsa.pub >> authorized_keys2;"
echo; echo; echo
echo "try an ssh $remote"
从http://folk.uio.no/hpl/scripting/doc/ssh-no-password.html复制而来