如何使用简单的被监禁用户通过 ssh 将字符串发送到服务器上的脚本,并将结果从本地计算机上的服务器保存到文件中?

如何使用简单的被监禁用户通过 ssh 将字符串发送到服务器上的脚本,并将结果从本地计算机上的服务器保存到文件中?

我将从本地计算机发送一个字符串到远程 ssh 服务器。

用户处于一个简单的监狱中,因此他无法执行命令、登录、在远程 bash 上执行某些操作或执行其他操作,他只能发送字符串/值/变量并run在 ssh 服务器上执行脚本。

这是用户的简单监狱

这是用户登录并运行 shell 的默认设置:

chsh -s /bin/bash [USER]

但我将简单监狱的设置更改为:

chsh -s /home/[USER]/./run [USER]

ssh 服务器接收该字符串并将该字符串更改为新结果。

我将这个新结果保存在本地计算机上一个名为OUTPUT.

经过尝试,我找到了这个解决方案,称其为黑客或错误,但我不知道这是否是正确的方法!

  1. 使用此命令,我可以使用没有密码的 ssh 密钥 ssh 到远程服务器。

我在本地计算机上连接到服务器的 SSH 命令:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] '123' <<< "$VALUE" > OUTPUT
  1. 该脚本从变量run接收字符串123$VALUE

run我的脚本在 SSH 服务器上的名称

#!/bin/bash
echo "WELCOME TO SSH"
read VALUE
echo $VALUE

这只是一个例子,看看我的意思,真正的脚本生成一个哈希。

  1. 在我的本地计算机上,我将远程 ssh 服务器OUTPUT脚本的结果存储/保存在我的文件中。run

我的本地文件OUTPUT以及服务器的结果

WELCOME TO SSH
123

read VALUE命令在没有提示的情况下将值保存123在变量中$VALUE,并将结果保存在我的本地计算机上。

执行步骤:

  1. 连接到 ssh 服务器
  2. 将字符串从我的本地计算机发送到远程 ssh 服务器
  3. 远程服务器将此字符串更改为新结果
  4. 将新结果保存在本地计算机上的文件中

当我启动 ssh 命令时它会打开连接,

该脚本有效,我WELCOME TO SSH在我的终端上看到并且

我在本地计算机上收到结果并且连接关闭。

您可以在您的计算机上轻松测试此示例以了解我的意思。

这正是我所需要的,但我想知道:

为什么我需要read

为什么我没有收到提示。

此示例的其他解决方案是什么?

如何使用被监禁的用户通过 ssh 将字符串发送到服务器上的脚本,并将结果从本地计算机上的服务器保存到文件中?

解决方案更新

从 @ilkkachu 回答我可以运行此命令并发送:

字符串和变量:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] "123" "$VALUE" > OUTPUT

细绳:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] "123"> OUTPUT

多变的:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] "$VALUE" > OUTPUT

没有什么:

ssh -i [KEY] -p [XXXX] [USER]@[HOST] > OUTPUT

#!/bin/bash

value=     # empty by default
if [ "$1" = -c ]; then
    value="$2"
fi
if [ -z "$value" ]; then
    echo "value is empty" >&2
    exit 1
fi
# do something with the value
echo "$value" | rev 

SSHauthorized_keys 命令选项

从这篇文章:

SSHauthorized_keys命令选项:多个命令?

不,这不是“允许”命令,而是“强制”命令(作为 ForceCommand 选项)。唯一的可能性是对不同的命令使用不同的键或从标准输入读取参数。

这是一个很好的提示,但适用于单个命令,例如备份或输出一些信息。

rsync如果我运行类似的命令,如果我不想收到错误,我必须做更多配置。

所以我将继续使用一个简单的被监禁的用户和给定的脚本。

答案1

使用ssh user@somehost <<< "$value"几乎相同echo "$value" | ssh user@somehost:变量的内容被发送到 SSH 客户端进程的标准输入。 SSH 将其传输到远程端,远程进程可以再次在标准输入上读取它。例如,使用 shell 的read,就像您在那里所做的那样。这是通过 SSH 连接传递数据的一种方法。

另一种方法是使用命令行参数。如果你跑

ssh user@somehost "some string here"

-c然后 SSH 要求远程端使用两个参数和运行远程用户的 shell some string here。与一个普通的shell,这将使 shell 将“此处的某个字符串”解释为 shell 命令行,因此确实ssh user@somehost "ls /tmp"可以运行ls. (ssh user@somehost ls /tmp执行相同的操作,SSH 客户端在将参数发送到远程之前将它们与空格连接起来。)

但是您已经更改了用户的 shell 以限制他们可以执行的操作,因此该-c选项不会执行 SSH 假定的操作。出于同样的原因,没有提示:您的脚本不会像普通 shell 那样打印提示。

不过,将脚本作为 shell 并不重要,因为它可以检测并忽略该-c选项并使用其后面的内容。

例如,您可以在遥控器上有这样的脚本:

#!/bin/bash

value=     # empty by default
if [ "$1" = -c ]; then
    value="$2"
fi
if [ -z "$value" ]; then
    echo "value is empty" >&2
    exit 1
fi
# do something with the value
echo "$value" | rev 

模拟示例将通过 传递值rev,反转字符串。

因此,运行ssh user@somehost "hello there"将返回字符串ereht olleh

仅运行ssh user@somehost,末尾没有“命令”,会触发脚本中的错误消息,但它也会使 SSH 表现得像启动交互式会话一样。它将在远程保留伪终端 (pty),并可能运行一些通常在登录期间完成的额外操作,例如在 Linux 上运行 PAM 会话模块。这些功能可以执行诸如打印“每日消息”或检查帐户是否有未读电子邮件之类的操作。与 相同ssh user@somehost "",所以你不能真正通过空的参数并期望它的行为与非空参数完全相同。


除了限制远程用户的 shell 之外,锁定可通过 SSH 运行的命令的另一种替代方法是使用 SSH 密钥,并使用command=...in authorized_keys.这样做还允许使用no-pty关键字禁用 pty 分配。 (仅运行与密钥相关的强制命令就可能会影响运行这些 PAM 会话模块。)请参阅 sshd手册页

答案2

我认为你感到困惑了。

你是什​​么起初询问:
当您有本地值(例如VALUE="XXXXXXXX"在本地计算机上)时,您可以将其保存到本地文件,OUTPUT而无需转到远程计算机。

你什么实际上想问:
可能性1:我认为,您需要一个远程值(例如VALUE="XXXXXXXX"在远程计算机上),并将其保存到本地文件中OUTPUT

解决方案1

ssh -i [KEY] -p [XXXX] [USER]@[HOST] 'echo ${VALUE}' > OUTPUT

注意:单引号,不是双引号!

在这里,单引号确保VALUE不在本地计算机中评估,但会在远程计算机上评估。

你什么实际上想问:
可能性2:“我想将值 VALUE 发送到在远程计算机上运行的脚本,该脚本将输出一些新值;我希望在本地文件 OUTPUT 中使用该新值”

解决方案2

ssh -i [KEY] -p [XXXX] [USER]@[HOST] /path/to/myscript "${VALUE}" > OUTPUT

注意:双引号,不是单引号!

在这里,我们通过命令行参数将 VALUE 传递给您的脚本。在 /path/to/myscript 中,您可以通过 $1 访问该值,例如:

VALUE=$1  
echo " I got $1 which I am storing in the variable VALUE which now contains $VALUE "  
#### Process VALUE & Compute new value and echo it  

你什么实际上想问:
可能性3:“我有一台远程计算机,用户只能登录、执行预定义脚本 ( /home/[USER]/./run) 并退出。我想将值 VALUE 发送到远程计算机上运行的脚本,该脚本将输出一些新值;我想要该新值在本地文件输出中”

解决方案3

ssh -i [KEY] -p [XXXX] [USER]@[HOST] MYVALUE "${VALUE}" > OUTPUT

注意:双引号,不是单引号!

在这里,我们通过命令行参数将字符串“MYVALUE”和变量 VALUE 的值传递给脚本。在您的脚本中/home/[USER]/./run,您可以通过 $1、$2、$2 等访问这些命令行参数值:

#!/bin/bash
echo "WELCOME TO SSH"
echo " I got \$1 which $1 "  
echo " I got \$2 which $2 "  
echo " I got \$3 which $3 "  
echo " I got \$4 which $4 "  
echo " I got \$5 which $5 "  
echo " I got \$6 which $6 "  
echo " I got \$7 which $7 "  
echo " I got \$8 which $8 "  
echo " I got \$9 which $9 "  
#### echo " I got STRING MYVALUE in ${N} and the value VALUE in ${M} which I am storing in the remote variable VALUE "  
#### VALUE=${M}  
#### echo $($VALUE + $VALUE)  

在这里,我回显所有命令行参数值 $1、$2、$3、$4、$5、$6、$7、$8、$9,以检查哪个具有 STRING MYVALUE 以及哪个具有变量 VALUE 的值。
当您发现例如 $3 具有正确的值时,删除所有不需要的echo行,取消注释最后 3 行,更新 N & M 并检查 ;它应该有效!

相关内容