簡體   English   中英

SSH:通過SSH執行時,無法在終端中使用的javac命令起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM