
我有一個透過 ssh 運行遠端腳本的本地腳本。本機腳本是minecraft.php:
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i {$this->pemkey} {$this->ssh_user} sudo /vol/start_bukkit.sh
遠端腳本為/vol/start_bukkit.sh:
#!/bin/bash
cd "/vol/bukkit"
/usr/bin/screen -S bukkit -m -d /usr/local/bin/java -Xnoclassgc -Xms1024M -Xmx1024M -jar /vol/bukkit/craftbukkit.jar nogui
發生的情況是 java 指令有效,啟動 craftbukkit.jar,但畫面沒有啟動新視窗。這是怎麼回事?如何建立一個新視窗?
如果我登入遠端伺服器並運行 start_bukkit.sh,則螢幕將按預期工作,創建一個新分離的窗口,在其中運行 craftbukkit.jar。
編輯:
我讓它工作了。我透過刪除 sudo 並放入 screen 命令來更新本機腳本。
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i {$this->pemkey} {$this->ssh_user} /usr/bin/screen -S bukkit -m -d /vol/start_bukkit.sh
在遠端,我刪除了 screen 命令:
#!/bin/bash
cd "/vol/bukkit"
/usr/local/bin/java -Xnoclassgc -Xms1024M -Xmx1024M -jar /vol/bukkit/craftbukkit.jar nogui
我無法解釋為什麼這有效。
答案1
嘗試使用您的指令強制使用 psuedo-tty ssh
。
ssh -t -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i
{$this->pemkey} {$this->ssh_user} sudo /vol/start_bukkit.sh
man 1 ssh
-t Force pseudo-tty allocation. This can be used to execute
arbitrary screen-based programs on a remote machine, which
can be very useful, e.g. when implementing menu services.
Multiple -t options force tty allocation, even if ssh has
no local tty.
另外,在您的腳本中start_bukkit.sh
,您沒有設定 PATH。您在呼叫java
時沒有使用絕對路徑,因此可能找不到。在腳本開頭設定 PATH(最佳實踐),或java
透過絕對路徑 ( /usr/bin/java
) 呼叫。