如何将输入/输出连接到SSH会话

时间:2019-06-17 08:05:05

标签: linux bash file-descriptor

什么是能够直接发送到STDIN并从过程的STDOUT接收的好方法?我对SSH特别感兴趣,因为我想执行以下操作:

[ssh into a remote server]
[run remote commands]
[run local commands]
[run remote commands]
 etc...

例如,假设我有一个本地脚本“ localScript”,它将根据“ remoteScript”的输出输出要远程运行的下一个命令。我可以做类似的事情:

output=$(ssh myServer "./remoteScript")
nextCommand=$(./localScript $output)
ssh myServer "$nextCommand"

但是这样做很好,而不必在每个步骤都关闭/重新打开SSH连接。

2 个答案:

答案 0 :(得分:1)

您可以将SSH输入和输出重定向到FIFO-s,然后将它们用于双向通信。

例如class Demo(models.Model): name = models.CharField(max_length=100) class Demo1(models.Model): demo = models.ForeignKey(Demo, default=None, blank=True, null=True, on_delete=models.CASCADE)

 class Demo1(ModelSerializer):
     demo = CharField(source='demo.name')
     class Meta:
         model=models.Demo1
         fields = ('id', 'demo')

简单的local.sh

#!/bin/sh

SSH_SERVER="myServer"

# Redirect SSH input and output to temporary named pipes (FIFOs)
SSH_IN=$(mktemp -u)
SSH_OUT=$(mktemp -u)
mkfifo "$SSH_IN" "$SSH_OUT"
ssh "$SSH_SERVER" "./remote.sh" < "$SSH_IN" > "$SSH_OUT" &

# Open the FIFO-s and clean up the files
exec 3>"$SSH_IN"
exec 4<"$SSH_OUT"
rm -f "$SSH_IN" "$SSH_OUT"

# Read and write
counter=0
echo "PING${counter}" >&3
cat <&4 | while read line; do
    echo "Remote responded: $line"
    sleep 1
    counter=$((counter+1))
    echo "PING${counter}" >&3
done

答案 1 :(得分:0)

您使用的方法有效,但我认为您不能每次都重复使用相同的连接。但是,您可以执行using screen, tmux or nohup,但这将大大增加脚本的复杂性,因为现在您必须模拟按键/快捷键。我什至不确定是否可以直接使用bash进行操作。如果要模拟按键,则必须在新的x终端上运行脚本并使用xdotool to emulate the keypresses

另一种方法是仅通过running the script on the remote server itself将整个脚本委托给SSH服务器:

ssh root@MachineB 'bash -s' < local_script.sh