我将从本地计算机发送一个字符串到远程 ssh 服务器。
用户处于一个简单的监狱中,因此他无法执行命令、登录、在远程 bash 上执行某些操作或执行其他操作,他只能发送字符串/值/变量并run
在 ssh 服务器上执行脚本。
这是用户的简单监狱
这是用户登录并运行 shell 的默认设置:
chsh -s /bin/bash [USER]
但我将简单监狱的设置更改为:
chsh -s /home/[USER]/./run [USER]
ssh 服务器接收该字符串并将该字符串更改为新结果。
我将这个新结果保存在本地计算机上一个名为OUTPUT
.
经过尝试,我找到了这个解决方案,称其为黑客或错误,但我不知道这是否是正确的方法!
- 使用此命令,我可以使用没有密码的 ssh 密钥 ssh 到远程服务器。
我在本地计算机上连接到服务器的 SSH 命令:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] '123' <<< "$VALUE" > OUTPUT
- 该脚本从变量
run
接收字符串123
$VALUE
run
我的脚本在 SSH 服务器上的名称
#!/bin/bash
echo "WELCOME TO SSH"
read VALUE
echo $VALUE
这只是一个例子,看看我的意思,真正的脚本生成一个哈希。
- 在我的本地计算机上,我将远程 ssh 服务器
OUTPUT
脚本的结果存储/保存在我的文件中。run
我的本地文件OUTPUT
以及服务器的结果
WELCOME TO SSH
123
该read VALUE
命令在没有提示的情况下将值保存123
在变量中$VALUE
,并将结果保存在我的本地计算机上。
执行步骤:
- 连接到 ssh 服务器
- 将字符串从我的本地计算机发送到远程 ssh 服务器
- 远程服务器将此字符串更改为新结果
- 将新结果保存在本地计算机上的文件中
当我启动 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 命令选项
从这篇文章:
不,这不是“允许”命令,而是“强制”命令(作为 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 并检查 ;它应该有效!