[英]SSH: A javac command that works in terminal doesn't work when executed over SSH
我正在使用Python代碼使用SSH在Linux(Cloudera)計算機上運行Hadoop程序。
我在將Java文件編譯為類文件時遇到麻煩。 當我執行命令時:從Linux終端獲取javac -cp /usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/* remote_hadoop/javasrc/*
可以成功編譯所有文件。
當我通過Python SSH客戶端執行相同的命令時,我收到“無效標志”錯誤:
spur.results.RunProcessError:返回代碼:2輸出:b''stderr輸出:b'javac:無效標志:remote_hadoop / javasrc \\ n用法:javac \\ nuse -help列出可能的選項\\ n'
python代碼:
list_of_commands = ["javac", "-cp", r"/usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/*", input_folder + r"/*"]
print ' '.join(list_of_commands)
self.shell.run(list_of_commands)
由於正在打印的內容是javac -cp /usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/* remote_hadoop/javasrc/*
,因此該命令已正確呈現。
更新:這很奇怪。 我可以一次通過ssh編譯一個文件,但不是全部。 似乎ssh上的“ *”發生了什么。
您傳遞的是參數列表,而不是命令列表。 它甚至不是准確的參數列表。
如果您的基礎工具需要參數列表,請傳遞:
['sh', '-c', 'javac -cp /usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/* remote_hadoop/javasrc/*']
如果需要命令列表:
['javac -cp /usr/lib/hadoop/*:/usr/lib/hadoop/client-0.20/* remote_hadoop/javasrc/*']
如果還需要其他內容,請閱讀文檔並確定是什么東西!
注意,SSH沒有提供一種在運行任意命令時傳遞文字argv數組的方法。 相反,它希望在協議級別上有一個字符串可供遠程外殼程序解析。 如果您的self.shell.run
代碼在加入給定的參數列表之前正在對shell進行引用,那么它將以文本字符串 remote_hadoop/javasrc/*
形式傳遞最后一個參數,而不是像shell那樣將其擴展為文件名列表 。
使用sh -c
格式會強制遠程外殼程序在其末尾執行擴展,假設已以尚未進行遠程擴展的形式向其提供內容。
問題是spur
將命令列表構建為命令字符串的方式。 它獲取每個命令令牌並將其括在單引號中["ls", "*.txt"])
變為'ls' '*.txt'
)。 引號內沒有*
外殼擴展,因此該命令不起作用。
您可以在第323行的spur的ssh.py中看到問題:
def escape_sh(value):
return "'" + value.replace("'", "'\\''") + "'"
我不使用支線,但看起來它不允許您執行此類操作。 像spur這樣的“簡化程序”的問題在於,如果它們以您不希望的方式進行簡化,那么您將無法使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.