Answers:
不,没有任何方法可以使用opensh内置机制以非交互方式在命令行上指定或提供密码以进行ssh身份验证。至少没有我所知道的。您可以将密码硬编码为Expect脚本,但这也不是一个好的解决方案。
正如迈克尔所说,您绝对希望使用密钥对进行无密码身份验证,最后私钥在文件中几乎是一个很大的密码。
为了避免评论串:是的,这是不安全的(甚至可以说不是不安全的)。我强烈建议您仅在实验室环境中的隔离网络上或在不涉及生产服务器或没有完全重置/格式的情况下不涉及生产服务器的类似情况下,执行此操作。
我想进行此设置,因为我认为我的2950交换机不支持私钥/公钥,并且希望在某个时候获得这些知识,但是我还没有。
使用别名和sshpass可以实现。
我的示例别名是:
alias ssc='sshpass -pcisco ssh'
其中“ cisco”是密码。请注意,-p和密码之间没有空格。
用法是(引用问题):
ssc server1
注意:这仅针对使用搜索引擎的用户回答标题中的问题。如果您使用服务器(例如问题示例),则应使用私钥/公钥对而不是此答案
是的,如上所述,无法简单地保存密码。我建议使用ssh密钥进行授权。
首先,生成您的密钥:
ssh-keygen
然后在服务器/台式机上复制密钥:
ssh-copy-id -i .ssh/id_rsa.pub user@ip-address:
就这样。永远不会再要求您输入密码。
我还建议您一般删除密码授权,但这取决于您。
sshpass -p $PASSWORD ssh $USERNAME@$HOST "echo `cat ~/.ssh/id_rsa` >> /home/$USERNAME/.ssh/authorized_keys"
但是该程序更干净,使意图更清晰。
我从~/.local/bin
目录使用此脚本
#!/usr/bin/bash
ORIG_SSH=/usr/bin/ssh
HOST=$1
SSHPASS=$(grep -Pzo "Host $HOST"'\s*\n((?!Host).*\n)*#PS\s(\N+)\n' ~/.ssh/config|tail -n 2|head -n 1 | sed 's/#PS //')
if [ -n $SSHPASS ]; then
export SSHPASS
sshpass -e $ORIG_SSH $@
else
$ORIG_SSH $@
fi
这让我指定密码为#PS <password>
在.ssh/config
文件中。
但是,正如大家说,这是更好地利用ssh-keys
与ssh-agent
当它是可能的
处理这种情况的正确方法是使用基于会话的ssh-agent。方法如下:
$ eval `ssh-agent`
$ ssh-add /home/user/.ssh/your_key
Enter passphrase for /home/user/.ssh/your_key:
密码将在其余会话中保持有效。您只需要运行一次第一个命令,然后就可以添加任意数量的键。当会话被杀死时,代理也会被杀死,因此不会存在密码的硬编码存储。
震惊了这么久之后,这个答案就没有了!
您可以使用sshpass以更安全的方式执行此操作
设置没有历史记录的密码
export PS = your_password ; history -d $(历史1)
在〜/ .ssh / config中如上所述设置主机别名
使用ssh pass使用环境变量并在单个命令中登录所需的计算机
sshpass -p $ PS ssh host_alias
您的环境正在保存您的密码,如果您不知道自己在运行什么,那么执行的任何脚本都可能泄漏该密码,这是有风险的
sshpass -p $PS ...