我有一个带有两个参数的bash脚本。在该脚本中,我需要使用heredoc调用ssh并调用一个期望这两个参数的方法。例如:
110
键是由我的脚本设置的,我知道那部分是好的。
但是,my_python_app打印出args并且它不显示-p和-f的任何参数
我会把我的脚本称为
ssh -o "IdentitiesOnly=yes" -t -i $key -l user localhost << 'ENDSSH'
/my_python_app.py -u -t tar -p $1 -f $2
ENDSSH
我在我的python应用程序中使用argparse,但我也打印出sys.argv它给了我:
my_script /tmp filename
请注意,没有收到-p和-f的值。 (-u是一个标志,并且设置正确)。
如何将$ 1和$ 2作为-p和-f值传递给my_python_app?
答案 0 :(得分:3)
删除here-document分隔符周围的引号(即使用<< ENDSSH
而不是<< 'ENDSSH'
)。引号告诉shell不要在here-document中扩展变量引用(以及其他一些东西),因此$1
和$2
会传递给远程shell ...这不会有任何参数,所以它什么都不用。
ssh -o "IdentitiesOnly=yes" -t -i $key -l user localhost << ENDSSH
/my_python_app.py -u -t tar -p '$1' -f '$2'
ENDSSH
如果可能包含单引号,则会更加复杂。
答案 1 :(得分:1)
更偏执的做法是:
# store these in an array to reduce the incidental complexity below
ssh_args=( -o "IdentitiesOnly=yes" -t -i "$key" -l user )
posixQuote() {
python -c 'import sys, pipes; sys.stdout.write(pipes.quote(sys.argv[1])+"\n")' "$@"
}
ssh "${ssh_args[@]}" localhost "bash -s $(posixQuote "$1") $(posixQuote "$2")" << 'ENDSSH'
/path/to/my_python_app.py -u -t tar -p "$1" -f "$2"
ENDSSH
如果您确切知道目标帐户的shell与本地shell匹配(如果本地shell是bash则为bash,如果本地shell为ksh则为ksh),请考虑以下内容:
printf -v remoteCmd '%q ' /path/to/my_python_app.py -u -t tar -p "$1" -f "$2"
ssh "${ssh_args[@]}" localhost "$remoteCmd"