您在这里遇到几个问题。
首先,SSH连接中的每个通道都独立于其他通道,每个exec通道中的命令都在其自己的shell(命令行解释器)中执行。因此,您在一个频道中所做的任何更改对其他频道完全没有影响。您也不能做这样的事情:
runSshCommand("cd documents", session);runSshCommand("ls -l", session);(实际上,您可以执行此操作,但它不会显示
documents目录的内容,而是显示主目录的内容。)
对于
cd,您可以通过将两个命令作为一个“命令”传递来解决,以在同一
exec通道中使用:
runSshCommand("cd documents; ls -l");(
;您也可以使用换行符
n来分隔命令,或者您的Shell接受的其他命令。)
因为
su这行不通,我们来解决 第二个问题 。
su不是更改当前外壳状态的命令(例如
cd),而是在现有外壳内部打开新外壳的命令。当你离开开始由壳它只会返回外壳
su(例如,通过
exit,
logout或最终的文件),然后你再相同的用户面前。
要将命令传递到“内壳”,您必须将它们传递到壳输入。或使用的
-c(
--command)参数
su:
runSshCommand("su -c 'tail -1 ~/mylog.log' - john ",session);然后,您可能会遇到 第三个问题
:
su将要求输入john的密码,并可能拒绝从标准输入中读取它,但是尝试从终端读取它。而且您的频道没有伪终端。您可以尝试使用
cannel.setPty(true)密码,然后将其实际写到输出流,尽管我不确定这是否可行。
替代方案:
su-c可以使用代替
sudo,而可以将其配置为不为某些命令和用户要求输入密码(否则,您将再次遇到相同的终端问题)。或者,您可以直接以身份登录
john,或使tom可读该日志文件。(此外,我希望您的真实密码比您的源代码中的密码更好。)



