简体   繁体   中英

Shell script to clone a GitHub Repo

I am trying to automate a process that contains a series of git commands.

I want the shell script to deal with some interactive commands, like passing the username and password to git clone url -v . I verified that if I just run git clone url -v it will show the following in order:

  1. cloning into someRepo
  2. asking for username
  3. asking for password

I've tried:

  1. echo -e 'username\\n' | git clone url -v
  2. echo -e 'username\\npassword\\n' | git clone url -v
  3. git clone url -v <<< username\\npassword\\n
  4. (sleep 5;echo -e 'username\\n' | git clone url -v)

I thought that the first message cloning into repo will take some time. None of them is working, but all of them are showing the same message that Username for url:

Having spent lots of time in this, I know that

git clone https://$username:$password@enterpriseGithub.com/org/repo

is working, but it is UNSAFE to use since the log show the username and password explicitly.

Better practice would be to avoid user/password authentication at all (as by configuring agent-based auth, ideally backed by private keys stored on physical tokens), or set up credential storage in a keystore provided (and hopefully secured) by your operating system -- but if you just want to keep credentials off the command line, that can be done:

# Assume that we already know the credentials we want to store...
gitUsername="some"; gitPassword="values"

# Create a file containing the credentials readable only to the current user
mkdir -p "$HOME/.git-creds/https"
chmod 700 "$HOME/.git-creds"
cat >"$HOME/.git-creds/https/enterprise-github.com" <<EOF
username=$gitUsername
password=$gitPassword
EOF

# Generate a script that can retrieve stored credentials
mkdir -p -- "$HOME/bin"
cat >"$HOME/bin/git-retrieve-creds" <<'EOF'
#!/usr/bin/env bash
declare -A args=( )
while IFS= read -r line; do
  case $line in
    *..*) echo "ERROR: Invalid request" >&2; exit 1;;
    *=*)  args[${line%%=*}]=${line#*=} ;;
    '')   break ;;
  esac
done

[[ ${args[protocol]} && ${args[host]} ]] || {
  echo "Did not retrieve protocol and host" >&2; exit 1;
}
f="$HOME/.git-creds/${args[protocol]}/${args[host]}"
[[ -s $f ]] && cat -- "$f"
EOF
chmod +x "$HOME/bin/git-retrieve-creds"

# And configure git to use that 
git config --global credential.helper "$HOME/bin/git-retrieve-creds"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM