bash 使用 python3 -c 命令的别名
bash alias with python3 -c command
我试图通过在我的 mac 上写入这样的 bash 别名来缩短获取 aws 访问令牌并将其写入 ~/.aws/credentials 文件的工作:
alias trial='function mfa(){ aws sts get-session-token --serial-number --token-code |python3 -c "import sys,subprocess;obj=eval(''.join(sys.stdin.readlines()).replace('\n',''));AccessKeyId=obj['Credentials']['AccessKeyId'];SecretAccessKey=obj['Credentials']['SecretAccessKey'];SessionToken=obj['Credentials']['SessionToken'];subprocess.check_output('aws configure set aws_access_key_id '+AccessKeyId+' --profile mfa', shell=True);subprocess.check_output('aws configure set aws_secret_access_key '+SecretAccessKey+' --profile mfa', shell=True);subprocess.check_output('aws configure set aws_session_token '+SessionToken+' --profile mfa', shell=True);"};mfa'
但由于某种原因,这不起作用。特别是 bash 编译器对 python3 -c 之后的部分不满意。有人可以帮忙吗?
不要使用别名,只需将函数命名为 mfa
。并将 Python 代码放入文件中。
mfa.py:
import sys, subprocess, json
obj=json.loads(sys.stdin.read())
AccessKeyId=obj['Credentials']['AccessKeyId']
SecretAccessKey=obj['Credentials']['SecretAccessKey']
SessionToken=obj['Credentials']['SessionToken']
subprocess.check_output(['aws', 'configure', 'set', 'aws_access_key_id', AccessKeyId, '--profile', 'mfa'])
subprocess.check_output(['aws', 'configure', 'set', 'aws_secret_access_key', SecretAccessKey, '--profile', 'mfa'])
subprocess.check_output(['aws', 'configure', 'set', 'aws_session_token', SessionToken, '--profile', 'mfa'])
请注意,我给 subprocess.check_output
一个列表而不是构造一个字符串,因此不需要 shell=True
。
然后定义函数:
mfa() {
aws sts get-session-token --serial-number "" --token-code "" | python /path/to/mfa.py
}
我假设会话令牌是 JSON,而不是 Python 语法,所以我使用 json.loads()
而不是 eval()
。要读取所有标准输入,请使用 sys.stdin.read()
而不是加入 readlines()
;不必要地创建一个列表,只是为了将它重新连接成一个长字符串。
我根本不会为此使用 Python; bash 和 jq
就足够了。
mfa() {
[[ && ]] || {
echo "Usage: mfa token-code serial-number" >&2
return 1
}
token_json=$(aws sts get-session-token --serial-number "" --token-code "") || return
IFS=$'\t' read -r accessKeyId secretAccessKey sessionToken _ < <(
jq -r '
.Credentials | [.AccessKeyId, .SecretAccessKey, .SessionToken] | @tsv
' <<<"$token_json"
) && [[ $accessKeyId && $secretAccessKey && $sessionToken ]] || return
aws configure set aws_access_key_id "$accessKeyId" --profile mfa || return
aws configure set aws_secret_access_key "$secretAccessKey" --profile mfa || return
aws configure set aws_session_token "$sessionToken" --profile mfa
}
如果您真的想要将 Python 源嵌入到您的 .bashrc
中,您也可以这样做:
mfa_py=$(cat <<'END-OF-PYTHON'
# adopting fixes made by Barmar to the Python code here
import sys, subprocess, json
obj=json.loads(sys.stdin.read())
AccessKeyId=obj['Credentials']['AccessKeyId']
SecretAccessKey=obj['Credentials']['SecretAccessKey']
SessionToken=obj['Credentials']['SessionToken']
subprocess.check_output(['aws', 'configure', 'set', 'aws_access_key_id', AccessKeyId, '--profile', 'mfa'])
subprocess.check_output(['aws', 'configure', 'set', 'aws_secret_access_key', SecretAccessKey, '--profile', 'mfa'])
subprocess.check_output(['aws', 'configure', 'set', 'aws_session_token', SessionToken, '--profile', 'mfa'])
END-OF-PYTHON
)
mfa() {
aws sts get-session-token --serial-number "" --token-code "" | python -c "$mfa_py"
}
在您最初的别名定义中,shell 将明显打算作为文字的引号解析为句法,因此 Python 解释器仍然无法读取它们.
在这里,我们使用引用的 heredoc 来确保 <<'END-OF-PYTHON'
和 END-OF-PYTHON
之间的所有内容(包括引号)都被视为文字。
感谢大家的回复。最终我最终将所有内容都放在了一个 python 文件中,如下所示:
import sys, subprocess, json
output = subprocess.Popen('aws sts get-session-token --serial-number sys.argv[2] --token-code '+sys.argv[1], shell=True,stdout=subprocess.PIPE)
output = json.loads(output.communicate()[0].decode('utf-8').strip())
AccessKeyId=output['Credentials']['AccessKeyId']
SecretAccessKey=output['Credentials']['SecretAccessKey']
SessionToken=output['Credentials']['SessionToken']
subprocess.check_output('aws configure set aws_access_key_id '+AccessKeyId+' --profile mfa', shell=True)
subprocess.check_output('aws configure set aws_secret_access_key '+SecretAccessKey+' --profile mfa', shell=True)
subprocess.check_output('aws configure set aws_session_token '+SessionToken+' --profile mfa', shell=True)
然后在 bash_profile 我有一个别名 :
alias a="python3 ~/bin/python3_mfa.py "
这是有效的。但如果我在别名中添加更多命令,它就会停止工作。试图弄清楚这一点。例如:
alias a="python3 ~/bin/python3_mfa.py ;eb ssh env --profile mfa;"
无效。
我试图通过在我的 mac 上写入这样的 bash 别名来缩短获取 aws 访问令牌并将其写入 ~/.aws/credentials 文件的工作:
alias trial='function mfa(){ aws sts get-session-token --serial-number --token-code |python3 -c "import sys,subprocess;obj=eval(''.join(sys.stdin.readlines()).replace('\n',''));AccessKeyId=obj['Credentials']['AccessKeyId'];SecretAccessKey=obj['Credentials']['SecretAccessKey'];SessionToken=obj['Credentials']['SessionToken'];subprocess.check_output('aws configure set aws_access_key_id '+AccessKeyId+' --profile mfa', shell=True);subprocess.check_output('aws configure set aws_secret_access_key '+SecretAccessKey+' --profile mfa', shell=True);subprocess.check_output('aws configure set aws_session_token '+SessionToken+' --profile mfa', shell=True);"};mfa'
但由于某种原因,这不起作用。特别是 bash 编译器对 python3 -c 之后的部分不满意。有人可以帮忙吗?
不要使用别名,只需将函数命名为 mfa
。并将 Python 代码放入文件中。
mfa.py:
import sys, subprocess, json
obj=json.loads(sys.stdin.read())
AccessKeyId=obj['Credentials']['AccessKeyId']
SecretAccessKey=obj['Credentials']['SecretAccessKey']
SessionToken=obj['Credentials']['SessionToken']
subprocess.check_output(['aws', 'configure', 'set', 'aws_access_key_id', AccessKeyId, '--profile', 'mfa'])
subprocess.check_output(['aws', 'configure', 'set', 'aws_secret_access_key', SecretAccessKey, '--profile', 'mfa'])
subprocess.check_output(['aws', 'configure', 'set', 'aws_session_token', SessionToken, '--profile', 'mfa'])
请注意,我给 subprocess.check_output
一个列表而不是构造一个字符串,因此不需要 shell=True
。
然后定义函数:
mfa() {
aws sts get-session-token --serial-number "" --token-code "" | python /path/to/mfa.py
}
我假设会话令牌是 JSON,而不是 Python 语法,所以我使用 json.loads()
而不是 eval()
。要读取所有标准输入,请使用 sys.stdin.read()
而不是加入 readlines()
;不必要地创建一个列表,只是为了将它重新连接成一个长字符串。
我根本不会为此使用 Python; bash 和 jq
就足够了。
mfa() {
[[ && ]] || {
echo "Usage: mfa token-code serial-number" >&2
return 1
}
token_json=$(aws sts get-session-token --serial-number "" --token-code "") || return
IFS=$'\t' read -r accessKeyId secretAccessKey sessionToken _ < <(
jq -r '
.Credentials | [.AccessKeyId, .SecretAccessKey, .SessionToken] | @tsv
' <<<"$token_json"
) && [[ $accessKeyId && $secretAccessKey && $sessionToken ]] || return
aws configure set aws_access_key_id "$accessKeyId" --profile mfa || return
aws configure set aws_secret_access_key "$secretAccessKey" --profile mfa || return
aws configure set aws_session_token "$sessionToken" --profile mfa
}
如果您真的想要将 Python 源嵌入到您的 .bashrc
中,您也可以这样做:
mfa_py=$(cat <<'END-OF-PYTHON'
# adopting fixes made by Barmar to the Python code here
import sys, subprocess, json
obj=json.loads(sys.stdin.read())
AccessKeyId=obj['Credentials']['AccessKeyId']
SecretAccessKey=obj['Credentials']['SecretAccessKey']
SessionToken=obj['Credentials']['SessionToken']
subprocess.check_output(['aws', 'configure', 'set', 'aws_access_key_id', AccessKeyId, '--profile', 'mfa'])
subprocess.check_output(['aws', 'configure', 'set', 'aws_secret_access_key', SecretAccessKey, '--profile', 'mfa'])
subprocess.check_output(['aws', 'configure', 'set', 'aws_session_token', SessionToken, '--profile', 'mfa'])
END-OF-PYTHON
)
mfa() {
aws sts get-session-token --serial-number "" --token-code "" | python -c "$mfa_py"
}
在您最初的别名定义中,shell 将明显打算作为文字的引号解析为句法,因此 Python 解释器仍然无法读取它们.
在这里,我们使用引用的 heredoc 来确保 <<'END-OF-PYTHON'
和 END-OF-PYTHON
之间的所有内容(包括引号)都被视为文字。
感谢大家的回复。最终我最终将所有内容都放在了一个 python 文件中,如下所示:
import sys, subprocess, json
output = subprocess.Popen('aws sts get-session-token --serial-number sys.argv[2] --token-code '+sys.argv[1], shell=True,stdout=subprocess.PIPE)
output = json.loads(output.communicate()[0].decode('utf-8').strip())
AccessKeyId=output['Credentials']['AccessKeyId']
SecretAccessKey=output['Credentials']['SecretAccessKey']
SessionToken=output['Credentials']['SessionToken']
subprocess.check_output('aws configure set aws_access_key_id '+AccessKeyId+' --profile mfa', shell=True)
subprocess.check_output('aws configure set aws_secret_access_key '+SecretAccessKey+' --profile mfa', shell=True)
subprocess.check_output('aws configure set aws_session_token '+SessionToken+' --profile mfa', shell=True)
然后在 bash_profile 我有一个别名 :
alias a="python3 ~/bin/python3_mfa.py "
这是有效的。但如果我在别名中添加更多命令,它就会停止工作。试图弄清楚这一点。例如:
alias a="python3 ~/bin/python3_mfa.py ;eb ssh env --profile mfa;"
无效。