shell中的#代表啥呢,有啥用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell中的#代表啥呢,有啥用法相关的知识,希望对你有一定的参考价值。

如# vi test

1)脚本中
脚本中#之后的为注释
#在第一列的话,则整行为注释。
#不在第一列的话,#左面的是命令,#的右面(后面)为注释

2)在命令行中,或者在讲解命令的例子中,如# vi test,#有可能是系统提示符,可以忽略它。知道vi tst.txt就行了
参考技术A 1)脚本中
脚本中#之后的为注释
#在第一列的话,则整行为注释。
#不在第一列的话,#左面的是命令,#的右面(后面)为注释

2)在命令行中,或者在讲解命令的例子中,如# vi test,#有可能是系统提示符,可以忽略它。知道vi tst.txt就行了!

JSch中的'shell'通道和'exec'通道有啥区别

【中文标题】JSch中的\'shell\'通道和\'exec\'通道有啥区别【英文标题】:What is the difference between the 'shell' channel and the 'exec' channel in JSchJSch中的'shell'通道和'exec'通道有什么区别 【发布时间】:2011-10-09 20:34:18 【问题描述】:

我希望能够将 Java 应用程序中表示为字符串的许多连续命令发送到 SSH 服务器以供执行。我应该使用:

Channel channel = session.openChannel("shell");

-或-

Channel channel = session.openChannel("exec");

【问题讨论】:

【参考方案1】:

您可以在 JSch wiki 中的 »Shell, Exec or Subsystem Channel« 中找到有关这些流之间差异和相似之处的概述。以下是您的用例的一些详细信息。

exec channel 中,命令来自您使用setCommand() 提供的命令字符串。 SSH 服务器会立即将它们传递给 shell(使用类似 bash -c '<command>' 的东西)。

如果 shell 由于某种原因之前没有退出,它们都将被执行。 (如果需要,您可以在此处发送一个完整的 shell 脚本,该脚本使用 if 和类似方法实现一些逻辑。)

因此,要执行多个命令,您可以通过使用; 或换行符 (\n) 分隔它们将它们传递到 exec 通道。由于在给出所有命令之前您不能等待结果,因此您只能使用多个 exec 通道(但由于每个通道都会生成一个新的 shell,它们不会保存它们之间的状态,例如工作目录或 shell 变量)。

shell channel 中,shell 将从流中读取输入,并将第一行解释为一个命令(或多个命令)。

然后它会执行这个命令。如果需要,命令本身可能会从流中读取更多输入。

然后shell会读取下一行,将其解释为命令,然后执行。

(在某些情况下,shell 必须读取多行,例如对于长字符串或组合命令,如 if 或循环。)

这将一直持续到流结束(例如您身边的 stream.close())或执行显式退出命令。

如果您不通过通道输入/输出流向外壳发送任何输入,外壳将简单地等待,直到您发送更多或关闭流。因此,您可以安静地读取一个命令的输出,在客户端进行一些计算,然后决定接下来发送哪个命令。

只要确保不要将一个命令的输入与下一个命令的文本混合在一起 - 最好不要使用将从标准输入读取的任何命令。

【讨论】:

频道的扩展数据到底是什么? 实际上,这包含命令/shell 输出到“标准错误”输出流的内容。理论上,其他类型的扩展数据也是可以考虑的,但是RFC 4254 只定义了这种类型,JSch 不允许区分不同的类型。【参考方案2】:

使用 shell 通道启动 shell(在 unix 上是 sh 或 bash 或类似的东西,在 Windows 上通常是 cmd.exe)并创建控制台(如果您在本地运行它们,您会在屏幕上看到相同的内容)。您有一个提示,您可以解析或使用它来检测命令的完成。

使用命令通道会为每个命令启动一个 shell 实例(实际上是为每个命令打开通道),然后将一个命令作为 shell 的参数传递(在 Windows 上它看起来像“cmd.exe /c”。

使用命令通道更容易,因为您不需要处理命令提示符。

【讨论】:

实际上,您可以将多个命令传递给一个 exec 通道 - 或者可以说是一个复合命令。只需用;\n 将它们分开即可。 @Paŭlo 我倾向于将其称为“复合命令”。这也是 unix 特定的表示法——在 Windows 中它似乎不起作用(当然,使用 cmd.exe)。 这个词是对的——就是懒得查。一般来说,这将取决于 shell(或 SSH 服务器与 shell 的交互) - 如果 cmd.exe 不接受多个命令,对 Windows 用户不利:-((我没有 Windows 来检查这个。) 可以使用&在windows上完成(即与;在linux上的效果相同)。更多信息可以在这里找到(&&||())google.com.eg/… 我在复合命令的第一个 ;=delimited 标记中获取脚本时遇到问题,它设置并导出一个 var 但复合命令的第二部分看不到它。例如". ./.profile; echo $SOME_VAR_FROM_PROFILE" 为回显返回空白。有什么想法吗?【参考方案3】:

好吧,我发现这很有效,如果您想像常规 shell 一样保留状态,这真的很方便:

Session session = jsch.getSession(user, host, 22);

Channel channel = session.openChannel("shell");

OutputStream inputstream_for_the_channel = channel.getOutputStream();
PrintStream commander = new PrintStream(inputstream_for_the_channel, true);

channel.setOutputStream(System.out, true);

channel.connect();

commander.println("ls -la");    
commander.println("cd folder");
commander.println("ls -la");
commander.println("exit");
commander.close();

do 
    Thread.sleep(1000);
 while(!channel.isEOF());

session.disconnect();

你可以改变

channel.setOutputStream(System.out, true);

InputStream outputstream_from_the_channel = channel.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(outputstream_from_the_channel));
String line;
while ((line = br.readLine()) != null)
    System.out.print(line+"\n");

如果您想对输出进行更多控制。

================================================ ===============================

已编辑:跟进

为什么有时我通过 PrintStream 发送的命令会随机出现在输出中。 IE。 以下代码:

shell[0].println("cd ..");
shell[0].println("cd ..");
shell[0].println("ls -la");
shell[0].println("exit");

产生这个: (标有 thing 的是不应该存在的东西!)

上次登录时间:2011 年 7 月 21 日星期四 21:49:13 从网关

清单:trunk-latest

[主机 ~]$ cd .. cd ..[主机主页]$ [主机主页]$ cd .. [主机/]$ [主机 /]$ ls -la 退出

总共 9999 ---------- 27 根根 4096 2010 年 1 月 26 日。 ---------- 27 根根 4096 2010 年 1 月 26 日 .. ---------- 1 根根 0 Mar 14 19:16 .autojyk ---------- 1 根 0 2009 年 2 月 9 日 .automan ---------- 1 根根 3550 2010 年 5 月 14 日 .bash_history d--------- 2 root root 4096 Apr 26 04:02 put d--------- 5 root root 4024 Apr 25 19:31 启动 [m[主机/]$ [主机 /]$ 退出 注销

【讨论】:

您可以尝试关闭服务器端的终端 - 也许外壳不会回显命令。 (类似于 channel.setPty(false)。虽然我不确定这里的默认设置是什么。) 我试过这段代码并且工作正常。但是连接后会显示很多消息..如何控制输出以便仅显示指挥官输出?? @RageshKr,您的意思是分别获取每个命令吗?将拆分字符串添加到不同的命令边框,例如commander.println("echo 'COMMAND_BEGIN'"); commander.println("ls -la"); commander.println("echo 'COMMAND_END'");【参考方案4】:

这与 JSch 无关。是关于服务器如何实现这两个通道的。


通用 *nix OpenSSH 服务器:

shell 通道执行登录 shell(就像您使用 SSH 终端客户端登录一样)。然后,shell 将显示命令提示符并等待客户端/用户键入命令。 shell 通道的目的是实现交互式 shell 会话。这是一个人很少会做的事情。如果这样做,您通常希望使用终端仿真。

shell 通道显然是 SSH 终端客户端(如 OpenSSH ssh 或 PuTTY)在正常情况下使用的。

shell 通道是一个带有输入和输出的黑盒子。输入和输出没有结构。例如,如果您通过将命令发送到输入来执行命令,您将永远无法知道它何时结束。如果你向输入队列发送两个命令,你将无法区分什么输出来自什么命令。

exec 命令将命令作为“参数”并在隔离环境中执行它——仍然通过用户的默认 shell,但不是作为“登录”shell,这可能会导致命令执行存在显着差异。

exec 频道的目的是自动执行命令。所以通常你不想使用终端仿真,以避免命令做一些花哨的事情,比如分页、着色和主要是交互式确认。

exec 通道由 OpenSSH ssh 或 PuTTY plink 使用,当您指定要在其命令行上执行的命令时:

ssh user@host command

对于不太常见的 SSH 服务器,差异可能更加显着。有些服务器甚至可能不支持其中一个频道。它们似乎同时支持两者也很常见,但其中一个(通常是 exec)完全损坏了。


Python/Paramiko 也有类似的问题:What is the difference between exec_command and send with invoke_shell() on Paramiko?

【讨论】:

以上是关于shell中的#代表啥呢,有啥用法的主要内容,如果未能解决你的问题,请参考以下文章

WLAN MAC地址的那些字母数字代表啥呢??

HFSS仿真中的gaintotal和realizedgaintotal分别代表啥 有啥意义啊

shell 脚本中的 `kill -0 $pid` 有啥作用?

初学java。。代码中里有cmd是代表啥呢

shell基础知识

python中的set有啥用