如何使用expect和git clone?
Posted
技术标签:
【中文标题】如何使用expect和git clone?【英文标题】:How to use expect and git clone? 【发布时间】:2011-09-25 18:02:17 【问题描述】:我正在尝试从我的私人 git 存储库中克隆,使用期望在一行中输入密码。
我正在尝试类似的东西:
expect -c 'spawn git clone user@..*.*:/var/.../repository.git/;期待“(是/否)?”;发送“是\n”;期望“密码:”;发送 "my_password\n";interact'
但是,它不起作用。 我究竟做错了什么?如何修复上面的命令行?
谢谢,Arshavdki Alexander
【问题讨论】:
expect 不能按预期工作的原因是因为 ssh 是 正确 直接写入终端,而不是 stdout 或 stderr。 【参考方案1】:您为什么不使用比密码更安全的东西来简化您的生活?
没有密码的 ssh 密钥将显着更加安全,并且根本不会提示。
如果它必须是 100% 自包含的,那么考虑让脚本输出 SSH 密钥,使用一次,然后删除它。 (这应该使您的安全状况保持不变:密码在脚本中有效,您可以接受。)
# Output SSH key for no-password login. (Could use mktemp instead)
cat > /tmp/ssh_key.$$ <<EOT
-----BEGIN RSA PRIVATE KEY-----
blahblahblah
-----END RSA PRIVATE KEY-----
EOT
# Make a SSH wrapper to do the right thing
cat > /tmp/git_ssh.$$ <<EOT
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /tmp/ssh_key.$$ "$@"
EOT
chmod +x /tmp/git_ssh.$$
export GIT_SSH=/tmp/git_ssh.$$
# Done!
git clone user@host:path/to/repo
# Cleanup
rm -f /tmp/git_ssh.$$ /tmp/ssh_key.$$
是的,该脚本看起来很笨拙,但(模数错误)它是独立的,对于自动化非常有用。
【讨论】:
问题是我正在编写一个部署脚本,这应该从脚本运行。 ...更有理由让它更加安全和自动化,对吧?也许您应该查看 ssh 的 github 指南? help.github.com/set-up-git-redirect 你能回答我的问题吗? 我不明白我是怎么做到的。我自己做这件事。 说真的,使用 ssh 密钥是唯一的明智选项。【参考方案2】:你可以通过直接在url中输入密码来避免使用expect
git clone https://username:password@github.com/username/repository.git
请注意 - 这会导致您的密码存储在 .git 文件中,从而使其成为永久不安全的选项。
但是,您可以省略密码:
git clone https://username@github.com/username/repository.git
git 会要求你输入密码,它不会保存在 .git/config 或你的 bash 历史记录中
【讨论】:
不幸的是,这样做会导致您的密码存储在 .git 文件中,这使得它成为一个永久不安全的选项。这不应该被使用。以上是关于如何使用expect和git clone?的主要内容,如果未能解决你的问题,请参考以下文章
如何在nodejs服务器中使用命令'git clone url'[关闭]